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
, decoder
, 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
]
58 # decoder2 - an instance of power_decoder2
59 # regfile - a list of initial values for the registers
60 def __init__(self
, decoder2
, regfile
):
61 self
.gpr
= GPR(decoder2
, regfile
)
63 self
.namespace
= {'GPR': self
.gpr
,
65 'memassign': self
.memassign
68 def memassign(self
, ea
, sz
, val
):
69 self
.mem
.memassign(ea
, sz
, val
)
72 function
, read_regs
, uninit_regs
, write_regs
= self
.instrs
[name
]
78 """ Decorator factory. """
79 def variable_injector(func
):
81 def decorator(*args
, **kwargs
):
83 func_globals
= func
.__globals
__ # Python 2.6+
84 except AttributeError:
85 func_globals
= func
.func_globals
# Earlier versions.
87 saved_values
= func_globals
.copy() # Shallow copy of dict.
88 func_globals
.update(context
)
90 result
= func(*args
, **kwargs
)
91 #exec (func.__code__, func_globals)
94 # func_globals = saved_values # Undo changes.
100 return variable_injector
102 if __name__
== '__main__':
104 namespace
= {'a': 5, 'b': 3, 'd': d
}