Skip to content

Commit 3217952

Browse files
committed
Use the _log_object_assocs array for softcoded proxy attribute registration
1 parent d0c3fee commit 3217952

File tree

6 files changed

+32
-36
lines changed

6 files changed

+32
-36
lines changed

include/simics/dmllib.h

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3137,15 +3137,15 @@ UNUSED static inline uint64 _identity_to_key(_identity_t id) {
31373137
typedef struct {
31383138
uint32 port_obj_offset;
31393139
uint32 index_divisor;
3140-
} _dml_log_object_assoc_t;
3140+
} _dml_port_object_assoc_t;
31413141

31423142
UNUSED static inline conf_object_t *
3143-
_identity_to_logobj(const _dml_log_object_assoc_t *object_assocs,
3144-
conf_object_t *dev, _identity_t id) {
3145-
_dml_log_object_assoc_t obj_assoc = object_assocs[id.id - 1];
3146-
if (!obj_assoc.index_divisor) return dev;
3147-
return ((conf_object_t **)((char *)dev + obj_assoc.port_obj_offset))[
3148-
id.encoded_index / obj_assoc.index_divisor];
3143+
_identity_to_portobj(const _dml_port_object_assoc_t *port_object_assocs,
3144+
conf_object_t *dev, _identity_t id) {
3145+
_dml_port_object_assoc_t portobj_assoc = port_object_assocs[id.id - 1];
3146+
if (!portobj_assoc.index_divisor) return dev;
3147+
return ((conf_object_t **)((char *)dev + portobj_assoc.port_obj_offset))[
3148+
id.encoded_index / portobj_assoc.index_divisor];
31493149
}
31503150

31513151
static attr_value_t
@@ -3311,7 +3311,6 @@ typedef struct {
33113311
bool valid;
33123312
bool is_bank;
33133313
bool is_array;
3314-
ptrdiff_t port_obj_offset;
33153314
const char *portname;
33163315
} _dml_attr_parent_obj_proxy_info_t;
33173316

@@ -3338,6 +3337,7 @@ typedef struct {
33383337

33393338
UNUSED static void _DML_register_attributes(
33403339
conf_class_t *dev_class, const _id_info_t *id_info_array,
3340+
const _dml_port_object_assoc_t *port_object_assocs,
33413341
const _vtable_list_t *attribute_vtables, _each_in_t sequence,
33423342
_dml_attr_conf_info_t (*get_attribute_info)(_traitref_t),
33433343
attr_value_t (*get_attr)(void *, conf_object_t *, attr_value_t *),
@@ -3395,18 +3395,21 @@ UNUSED static void _DML_register_attributes(
33953395

33963396
_dml_attr_parent_obj_proxy_info_t proxy_info = attr_info.proxy_info;
33973397
if (proxy_info.valid) {
3398+
uint32 port_obj_offset =
3399+
port_object_assocs[list.id - 1].port_obj_offset;
3400+
ASSERT(port_obj_offset);
33983401
if (proxy_info.is_array) {
33993402
ASSERT(id_info.dimensions >= 1);
34003403
_register_port_array_legacy_proxy_attr(
3401-
dev_class, parent_obj_class, proxy_info.port_obj_offset,
3404+
dev_class, parent_obj_class, port_obj_offset,
34023405
id_info.dimsizes[0], proxy_info.is_bank,
34033406
proxy_info.portname, attr_info.name, get_portobj_attr,
34043407
set_portobj_attr, attr_info.flags, sb_str(&type),
34053408
attr_info.doc,
34063409
attr_get_info ? attr_get_info : attr_set_info);
34073410
} else {
34083411
_register_port_legacy_proxy_attr(
3409-
dev_class, parent_obj_class, proxy_info.port_obj_offset,
3412+
dev_class, parent_obj_class, port_obj_offset,
34103413
proxy_info.is_bank, proxy_info.portname, attr_info.name,
34113414
get_portobj_attr, set_portobj_attr, attr_info.flags,
34123415
sb_str(&type), attr_info.doc,

lib/1.4/dml-builtins.dml

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,8 @@ extern typedef struct { } _dml_detached_hook_queue_t;
615615
// Used by hooks
616616
session _dml_detached_hook_queue_t *_detached_hook_queue_stack;
617617

618+
extern typedef struct {} _dml_attr_parent_obj_proxy_info_t;
619+
618620
// Shared parameters for attributes, registers and connects, which all produce
619621
// attributes. Methods get_attribute and set_attribute are abstract.
620622
template _conf_attribute is object {
@@ -700,14 +702,6 @@ template _conf_attribute is object {
700702

701703
extern typedef size_t ptrdiff_t;
702704

703-
extern typedef struct {
704-
bool valid;
705-
bool is_bank;
706-
bool is_array;
707-
ptrdiff_t port_obj_offset;
708-
const char *portname;
709-
} _dml_attr_parent_obj_proxy_info_t;
710-
711705
/**
712706
## Attribute objects
713707

@@ -1023,10 +1017,12 @@ method _set_attribute_attr(const _dml_attr_getset_info_t *_conf_info,
10231017
}
10241018

10251019
extern typedef struct {} _vtable_list_t;
1020+
extern typedef struct {} _dml_port_object_assoc_t;
10261021

10271022
extern void *_DML_register_attributes(
1028-
conf_class_t *, const _id_info_t *, const _vtable_list_t *,
1029-
sequence(_conf_attribute), _dml_attr_conf_info_t (*)(_conf_attribute),
1023+
conf_class_t *, const _id_info_t *, const _dml_port_object_assoc_t *,
1024+
const _vtable_list_t *, sequence(_conf_attribute),
1025+
_dml_attr_conf_info_t (*)(_conf_attribute),
10301026
attr_value_t (*get)(void *, conf_object_t *, attr_value_t *),
10311027
set_error_t (*set)(void *, conf_object_t *, attr_value_t *,
10321028
attr_value_t *),
@@ -1035,10 +1031,12 @@ extern void *_DML_register_attributes(
10351031
attr_value_t *));
10361032

10371033
extern const _vtable_list_t *_each___conf_attribute;
1034+
extern const _dml_port_object_assoc_t *_port_object_assocs;
10381035

10391036
independent startup method _register_all_attributes() {
10401037
_DML_register_attributes(SIM_get_class(dev.classname),
10411038
_id_infos,
1039+
_port_object_assocs,
10421040
_each___conf_attribute,
10431041
each _conf_attribute in (dev),
10441042
&_get_attribute_info,

py/dml/c_backend.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2145,7 +2145,7 @@ def generate_object_vtables_array():
21452145
add_variable_declaration(
21462146
f'void * const _object_vtables[{len(dml.globals.objects)}]', init)
21472147

2148-
def generate_log_object_assocs_array():
2148+
def generate_port_object_assocs_array():
21492149
items = []
21502150
for node in dml.globals.objects:
21512151
object_node = (node if node.objtype in {'device', 'bank',
@@ -2173,8 +2173,8 @@ def generate_log_object_assocs_array():
21732173
items.append(f'{{{port_obj_offset}, {index_divisor}}}')
21742174
init = f'{{{", ".join(items)}}}'
21752175
add_variable_declaration(
2176-
'const _dml_log_object_assoc_t '
2177-
+ f'_log_object_assocs[{len(dml.globals.objects)}]',
2176+
'const _dml_port_object_assoc_t '
2177+
+ f'_port_object_assocs[{len(dml.globals.objects)}]',
21782178
init)
21792179

21802180
def generate_trait_method(m):
@@ -3328,8 +3328,9 @@ def generate_cfile_body(device, footers, full_module, filename_prefix):
33283328
generate_events(device)
33293329
generate_identity_data_decls()
33303330
generate_object_vtables_array()
3331-
if compat.shared_logs_on_device not in dml.globals.enabled_compat:
3332-
generate_log_object_assocs_array()
3331+
if not (dml.globals.dml_version == (1, 2)
3332+
and compat.shared_logs_on_device in dml.globals.enabled_compat):
3333+
generate_port_object_assocs_array()
33333334
generate_class_var_decl()
33343335
generate_startup_calls_entry_function(device)
33353336
generate_init_data_objs(device)

py/dml/codegen.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2649,7 +2649,7 @@ def stmt_log(stmt, location, scope):
26492649
identity = TraitObjIdentity(site, lookup_var(site, scope, "this"))
26502650
logobj = (log_object(site, dml.globals.device, ())
26512651
if compat.shared_logs_on_device in dml.globals.enabled_compat
2652-
else LogObjectFromObjIdentity(site, identity))
2652+
else PortObjectFromObjIdentity(site, identity))
26532653

26542654
if later_level is not None:
26552655
adjusted_later_level = later_level = ctree.as_int(codegen_expression(

py/dml/ctree.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@
140140
'ObjIdentity',
141141
'TraitObjIdentity',
142142
'ObjTraitRef',
143-
'LogObjectFromObjIdentity',
143+
'PortObjectFromObjIdentity',
144144
'NodeArrayRef',
145145
'SessionVariableRef',
146146
'mkNodeRef', 'NodeRef',
@@ -3536,7 +3536,7 @@ def ctype(self):
35363536
def read(self):
35373537
return "(%s).id" % (self.traitref.read(),)
35383538

3539-
class LogObjectFromObjIdentity(Expression):
3539+
class PortObjectFromObjIdentity(Expression):
35403540
priority = dml.expr.Apply.priority
35413541
@auto_init
35423542
def __init__(self, site, identity):
@@ -3546,7 +3546,7 @@ def ctype(self):
35463546
return TNamed('conf_object_t *')
35473547

35483548
def read(self):
3549-
return ('_identity_to_logobj(_log_object_assocs, &_dev->obj, '
3549+
return ('_identity_to_portobj(_port_object_assocs, &_dev->obj, '
35503550
+ f'{self.identity.read()})')
35513551

35523552
class TraitUpcast(Expression):

py/dml/structure.py

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2619,18 +2619,12 @@ def mkexpr(self, indices):
26192619
and need_port_proxy_attrs(object_parent)):
26202620
is_bank = 'true' if object_parent.objtype == 'bank' else 'false'
26212621
is_array = 'true' if object_parent.dimensions == 1 else 'false'
2622-
indices = ((mkLit(self.site, '0', TInt(32, False)),)
2623-
if object_parent.dimensions else ())
2624-
port_obj_offset = (
2625-
f'offsetof({crep.structtype(dml.globals.device)}, '
2626-
+ f'{crep.cref_portobj(object_parent, indices)})')
26272622

26282623
self.cached = ctree.mkLit(
26292624
self.site,
26302625
'(_dml_attr_parent_obj_proxy_info_t) { .valid = true,'
26312626
+ f'.is_bank = {is_bank}, .is_array = {is_array}, '
2632-
+ f'.port_obj_offset = {port_obj_offset}'
2633-
+ f', .portname = "{object_parent.name}" }}',
2627+
+ f'.portname = "{object_parent.name}" }}',
26342628
TNamed('_dml_attr_parent_obj_proxy_info_t'))
26352629
else:
26362630
self.cached = mkLit(

0 commit comments

Comments
 (0)