b46310beeb4983aa210f5ba68503e8bff90dd848
1 from functools
import wraps
2 from soc
.decoder
.selectable_int
import SelectableInt
, selectconcat
12 def __call__(self
, addr
, sz
):
14 for s
in range(sz
): # TODO: big/little-end
15 res
.append(SelectableInt(self
.mem
[addr
.value
+ s
], 8))
16 print ("memread", addr
, sz
, res
)
17 return selectconcat(*res
)
19 def memassign(self
, addr
, sz
, val
):
20 print ("memassign", addr
, sz
, val
)
22 byte
= (val
.value
) >> (s
*8) & 0xff # TODO: big/little-end
23 self
.mem
[addr
.value
+ s
] = byte
27 def __init__(self
, sd
, regfile
):
31 self
[i
] = SelectableInt(regfile
[i
], 64)
33 def __call__(self
, ridx
):
36 def set_form(self
, form
):
40 #rnum = rnum.value # only SelectableInt allowed
41 print("GPR getzero", rnum
)
43 return SelectableInt(0, 64)
46 def _get_regnum(self
, attr
):
47 getform
= self
.sd
.sigforms
[self
.form
]
48 rnum
= getattr(getform
, attr
)
51 def ___getitem__(self
, attr
):
52 print("GPR getitem", attr
)
53 rnum
= self
._get
_regnum
(attr
)
54 return self
.regfile
[rnum
]
61 self
.namespace
= {'GPR': self
.gpr
,
63 'memassign': self
.memassign
66 def memassign(self
, ea
, sz
, val
):
67 self
.mem
.memassign(ea
, sz
, val
)
71 """ Decorator factory. """
72 def variable_injector(func
):
74 def decorator(*args
, **kwargs
):
76 func_globals
= func
.__globals
__ # Python 2.6+
77 except AttributeError:
78 func_globals
= func
.func_globals
# Earlier versions.
80 saved_values
= func_globals
.copy() # Shallow copy of dict.
81 func_globals
.update(context
)
83 result
= func(*args
, **kwargs
)
84 #exec (func.__code__, func_globals)
87 # func_globals = saved_values # Undo changes.
93 return variable_injector
95 if __name__
== '__main__':
97 namespace
= {'a': 5, 'b': 3, 'd': d
}