void gen_soc_field(define_align_context_t& ctx, bool multidev, bool multireg, const soc_reg_field_t& field) { if(field.desc.size() != 0) { ctx.add_raw("/* Field: " + field.name + "\n"); fprint_description(ctx, "Description: " + field.desc + " */\n", " * "); } std::string prefix = g_soc_dev + "_" + g_soc_reg + "_" + g_soc_field; ctx.add("BP_" + prefix, to_str(field.first_bit)); ctx.add("BM_" + prefix, "0x" + to_hex(field.bitmask())); for(size_t i = 0; i < field.value.size(); i++) ctx.add("BV_" + prefix + "__" + field.value[i].name, "0x" + to_hex(field.value[i].value)); ctx.add("BF_" + prefix + "(v)", "(((v) << " + to_str(field.first_bit) + ") & 0x" + to_hex(field.bitmask()) + ")"); if(field.value.size() > 0) ctx.add("BF_" + prefix + "_V(v)", "((BV_" + prefix + "__##v" + " << " + to_str(field.first_bit) + ") & 0x" + to_hex(field.bitmask()) + ")"); }
void my_lua_create_field(soc_addr_t addr, const soc_reg_field_t& field, bool sct) { lua_newtable(g_lua); lua_pushstring(g_lua, field.name.c_str()); lua_setfield(g_lua, -2, "name"); lua_pushunsigned(g_lua, addr); lua_setfield(g_lua, -2, "addr"); lua_pushboolean(g_lua, sct); lua_setfield(g_lua, -2, "sct"); lua_pushunsigned(g_lua, field.first_bit); lua_setfield(g_lua, -2, "first_bit"); lua_pushunsigned(g_lua, field.last_bit); lua_setfield(g_lua, -2, "last_bit"); lua_pushunsigned(g_lua, field.bitmask()); lua_setfield(g_lua, -2, "bitmask"); soc_word_t local_bitmask = field.bitmask() >> field.first_bit; lua_pushunsigned(g_lua, local_bitmask); lua_setfield(g_lua, -2, "local_bitmask"); lua_pushunsigned(g_lua, addr); lua_pushunsigned(g_lua, field.first_bit); lua_pushunsigned(g_lua, local_bitmask); lua_pushcclosure(g_lua, my_lua_read_field, 3); lua_setfield(g_lua, -2, "read"); lua_pushunsigned(g_lua, addr); lua_pushunsigned(g_lua, field.first_bit); lua_pushunsigned(g_lua, local_bitmask); lua_pushvalue(g_lua, -4); lua_pushboolean(g_lua, false); lua_pushcclosure(g_lua, my_lua_write_field, 5); lua_setfield(g_lua, -2, "write"); if(sct) { lua_pushunsigned(g_lua, addr + 4); lua_pushunsigned(g_lua, field.first_bit); lua_pushunsigned(g_lua, local_bitmask); lua_pushvalue(g_lua, -4); lua_pushboolean(g_lua, true); lua_pushcclosure(g_lua, my_lua_write_field, 5); lua_setfield(g_lua, -2, "set"); lua_pushunsigned(g_lua, addr + 8); lua_pushunsigned(g_lua, field.first_bit); lua_pushunsigned(g_lua, local_bitmask); lua_pushvalue(g_lua, -4); lua_pushboolean(g_lua, true); lua_pushcclosure(g_lua, my_lua_write_field, 5); lua_setfield(g_lua, -2, "clr"); lua_pushunsigned(g_lua, addr + 12); lua_pushunsigned(g_lua, field.first_bit); lua_pushunsigned(g_lua, local_bitmask); lua_pushvalue(g_lua, -4); lua_pushboolean(g_lua, true); lua_pushcclosure(g_lua, my_lua_write_field, 5); lua_setfield(g_lua, -2, "tog"); } for(size_t i = 0; i < field.value.size(); i++) { lua_pushunsigned(g_lua, field.value[i].value); lua_setfield(g_lua, -2, field.value[i].name.c_str()); } }