Skip to content

Commit aa97f79

Browse files
committed
Detect and convert uint64 based events
1 parent 32d2d83 commit aa97f79

File tree

6 files changed

+96
-0
lines changed

6 files changed

+96
-0
lines changed

py/dml/codegen.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3538,6 +3538,18 @@ def report_pevent_data_arg(meth_node, site, inargs):
35383538
if structure.method_is_std(meth_node.parent, 'get_event_info'):
35393539
report(PEVENT_NO_ARG(dmlparse.start_site(inargs[-1].site),
35403540
dmlparse.end_site(site)))
3541+
elif (isinstance(inargs[-1], ctree.Cast)
3542+
and safe_realtype(inargs[-1].expr.ctype()).is_int):
3543+
report(PEVENT_UINT64_ARG(
3544+
inargs[-1].site, dmlparse.end_site(inargs[-1].site),
3545+
meth_node.parent.site))
3546+
event_meth_node = meth_node.parent.get_component('event')
3547+
(argname, _) = event_meth_node.inp[0]
3548+
report(PCHANGE_INARGS(event_meth_node.site,
3549+
f'method event(uint64 {argname})'))
3550+
for methname in ['get_event_info', 'set_event_info']:
3551+
meth = meth_node.parent.get_component(methname)
3552+
report(PEVENT_REMOVE_INFO(meth.site, dmlparse.end_site(meth.site)))
35413553

35423554
def codegen_inline(site, meth_node, indices, inargs, outargs,
35433555
inhibit_copyin = False):

py/dml/messages.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2519,6 +2519,21 @@ class PEVENT_NO_ARG(PortingMessage):
25192519
`post`, `posted`, `next` and `remove` are removed.
25202520
"""
25212521

2522+
class PEVENT_UINT64_ARG(PortingMessage):
2523+
"""When one of the methods `post`, `posted`, `next` and `remove`
2524+
is called with an integer value cast to a pointer in the `data`
2525+
arg, that event is converted to a `uint64_time_event` or
2526+
`uint64_cycle_event`. The converter removes the cast and
2527+
causes the event object to be converted to a
2528+
`uint64_time_event` instead of `uint64_custom_event`.
2529+
"""
2530+
2531+
class PEVENT_REMOVE_INFO(PortingMessage):
2532+
"""When an event is converted to a `uint64_time_event` or
2533+
`uint64_cycle_event`, the `set_event_info` and `get_event_info` methods
2534+
are removed.
2535+
"""
2536+
25222537
class POVERRIDE(PortingMessage):
25232538
"""If a method has exactly one default and one non-default
25242539
declaration, and the non-default declaration resides in a

py/port_dml.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -409,6 +409,8 @@ def apply(self, f):
409409
f.edit(offset, length, decl)
410410

411411
class PINVOKE(Transformation):
412+
# before PEVENT_NO_ARG, PEVENT_UINT64_ARG
413+
phase = 0
412414
def apply(self, f):
413415
[offs, expr_offs, outarg_offs, semi_offs] = [
414416
self.offset(f, loc)
@@ -634,6 +636,10 @@ def instantiate_template(f, decl_offset, new_tpl):
634636
f.edit(offs, length, '(%s)' % (', '.join(sorted(tpls + [new_tpl])),))
635637

636638
class PATTRIBUTE(Transformation):
639+
# after PEVENT_UINT64_ARG
640+
phase = 2
641+
uint64_event_sites = set()
642+
637643
def remove_param_decl(self, f, param_site):
638644
offs = self.offset(f, param_site)
639645
# skip spaces backward
@@ -648,6 +654,8 @@ def remove_param_decl(self, f, param_site):
648654
def apply(self, f):
649655
offs = self.offset(f)
650656
(template, allocate_type_param, type_param) = self.params
657+
if self.loc in self.uint64_event_sites:
658+
template = template.replace('custom_', 'uint64_')
651659
instantiate_template(f, offs, template)
652660
self.remove_param_decl(f, allocate_type_param)
653661
if type_param:
@@ -665,6 +673,37 @@ def apply(self, f):
665673
end_offs -= 1
666674
f.edit(start_offs, end_offs - start_offs, '')
667675

676+
class PEVENT_UINT64_ARG(Transformation):
677+
# after PINVOKE
678+
phase = 1
679+
def apply(self, f):
680+
start_offs = self.offset(f)
681+
(end_site, event_site) = self.params
682+
PATTRIBUTE.uint64_event_sites.add(event_site)
683+
# remove `cast(..., void *)`
684+
end_offs = self.offset(f, end_site)
685+
line = f.read_line_up_to(end_offs)
686+
voidp_chars = len(line) - line.rindex(',')
687+
f.edit(end_offs - voidp_chars, voidp_chars + 1, '')
688+
f.edit(start_offs, 'cast(', '')
689+
690+
class RemoveMethod(Transformation):
691+
# after PRETVAL
692+
phase = 3
693+
def apply(self, f):
694+
offs = self.offset(f)
695+
(end_site,) = self.params
696+
end_offs = self.offset(f, end_site)
697+
offs -= len(rspace(f.read_line_up_to(offs)))
698+
end_offs += len(f.read_regexp(end_offs, re.compile(' *[}] *'))) + 1
699+
extra_blank = f.read_line(end_offs)
700+
sys.stderr.write(repr([end_offs, extra_blank]))
701+
if not extra_blank.strip():
702+
end_offs += len(extra_blank) + 1
703+
704+
f.edit(offs, end_offs - offs, '')
705+
706+
668707
class POVERRIDE(Transformation):
669708
class EPOVERRIDE(PortingFailure): tag = 'EPOVERRIDE'
670709
def apply(self, f):
@@ -1010,6 +1049,8 @@ def report(f, dest):
10101049
'PATTRIBUTE': PATTRIBUTE,
10111050
'PEVENT': PATTRIBUTE,
10121051
'PEVENT_NO_ARG': PEVENT_NO_ARG,
1052+
'PEVENT_UINT64_ARG': PEVENT_UINT64_ARG,
1053+
'PEVENT_REMOVE_INFO': RemoveMethod,
10131054
'POVERRIDE': POVERRIDE,
10141055
'POVERRIDE_IMPORT': POVERRIDE_IMPORT,
10151056
'PBEFAFT': PBEFAFT,

test/1.2/misc/porting.dml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,18 @@ event simple_ev2 {
378378
method event(data) {}
379379
}
380380

381+
event uint64_ev {
382+
parameter timebase = "seconds";
383+
method event(data) {}
384+
method get_event_info(void *data) -> (attr_value_t attr) {
385+
attr = SIM_make_attr_uint64(cast(data, uintptr_t));
386+
}
387+
388+
method set_event_info(attr_value_t attr) -> (void *data) {
389+
data = cast(SIM_attr_integer(attr), void *);
390+
}
391+
}
392+
381393
event custom_ev {
382394
parameter timebase = "cycles";
383395
method get_event_info(void *data) -> (attr_value_t attr) {
@@ -445,4 +457,9 @@ method init() {
445457
local uint64 next;
446458
call $simple_ev.next(NULL) -> (next);
447459
$simple_ev.remove(NULL);
460+
461+
inline $uint64_ev.post(1, cast(7 + 84, void *));
462+
call $uint64_ev.posted(cast(0, void *)) -> (posted);
463+
call $uint64_ev.next(cast(74, void *)) -> (next);
464+
$uint64_ev.remove(cast(cast(4, uintptr_t), void*));
448465
}

test/1.4/misc/porting.dml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,10 @@ event simple_ev2 is simple_time_event {
399399
method event() {}
400400
}
401401

402+
event uint64_ev is uint64_time_event {
403+
method event(uint64 data) {}
404+
}
405+
402406
event custom_ev is custom_cycle_event {
403407
method get_event_info(void *data) -> (attr_value_t) {
404408
return SIM_make_attr_nil();
@@ -470,4 +474,9 @@ method init() {
470474
local uint64 next;
471475
next = simple_ev.next();
472476
simple_ev.remove();
477+
478+
uint64_ev.post(1, 7 + 84);
479+
posted = uint64_ev.posted(0);
480+
next = uint64_ev.next(74);
481+
uint64_ev.remove(cast(4, uintptr_t));
473482
}

test/tests.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1408,6 +1408,8 @@ def test(self):
14081408
'PATTRIBUTE',
14091409
'PEVENT',
14101410
'PEVENT_NO_ARG',
1411+
'PEVENT_UINT64_ARG',
1412+
'PEVENT_REMOVE_INFO',
14111413
'POVERRIDE',
14121414
'PBEFAFT',
14131415
'PABSTRACT_TEMPLATE',

0 commit comments

Comments
 (0)