1 from functools
import wraps
2 from soc
.decoder
.orderedset
import OrderedSet
3 from soc
.decoder
.selectable_int
import SelectableInt
, selectconcat
5 def create_args(reglist
, extra
=None):
21 def __call__(self
, addr
, sz
):
23 for s
in range(sz
): # TODO: big/little-end
24 res
.append(SelectableInt(self
.mem
[addr
.value
+ s
], 8))
25 print ("memread", addr
, sz
, res
)
26 return selectconcat(*res
)
28 def memassign(self
, addr
, sz
, val
):
29 print ("memassign", addr
, sz
, val
)
31 byte
= (val
.value
) >> (s
*8) & 0xff # TODO: big/little-end
32 self
.mem
[addr
.value
+ s
] = byte
36 def __init__(self
, decoder
, regfile
):
40 self
[i
] = SelectableInt(regfile
[i
], 64)
42 def __call__(self
, ridx
):
45 def set_form(self
, form
):
49 #rnum = rnum.value # only SelectableInt allowed
50 print("GPR getzero", rnum
)
52 return SelectableInt(0, 64)
55 def _get_regnum(self
, attr
):
56 getform
= self
.sd
.sigforms
[self
.form
]
57 rnum
= getattr(getform
, attr
)
60 def ___getitem__(self
, attr
):
61 print("GPR getitem", attr
)
62 rnum
= self
._get
_regnum
(attr
)
63 return self
.regfile
[rnum
]
66 for i
in range(len(self
)):
67 print("reg", i
, hex(self
[i
].value
))
72 # decoder2 - an instance of power_decoder2
73 # regfile - a list of initial values for the registers
74 def __init__(self
, decoder2
, regfile
):
75 self
.gpr
= GPR(decoder2
, regfile
)
77 self
.namespace
= {'GPR': self
.gpr
,
79 'memassign': self
.memassign
81 self
.decoder
= decoder2
83 def memassign(self
, ea
, sz
, val
):
84 self
.mem
.memassign(ea
, sz
, val
)
86 def prep_namespace(self
):
87 si
= yield self
.decoder
.SI
88 self
.namespace
.SI
= SelectableInt(si
, bits
=16)
91 function
, read_regs
, uninit_regs
, write_regs
= self
.instrs
[name
]
92 input_names
= create_args(read_regs | uninit_regs
)
96 for name
in input_names
:
97 regnum
= yield getattr(self
.decoder
, name
)
98 print('reading reg %d' % regnum
)
99 inputs
.append(self
.gpr(regnum
))
101 results
= function(self
, *inputs
)
104 output_names
= create_args(write_regs
)
105 for name
, output
in zip(output_names
, results
):
106 regnum
= yield getattr(self
.decoder
, name
)
107 print('writing reg %d' % regnum
)
108 self
.gpr
[regnum
] = output
112 """ Decorator factory. """
113 def variable_injector(func
):
115 def decorator(*args
, **kwargs
):
117 func_globals
= func
.__globals
__ # Python 2.6+
118 except AttributeError:
119 func_globals
= func
.func_globals
# Earlier versions.
121 context
= args
[0].namespace
122 saved_values
= func_globals
.copy() # Shallow copy of dict.
123 func_globals
.update(context
)
125 result
= func(*args
, **kwargs
)
126 #exec (func.__code__, func_globals)
129 # func_globals = saved_values # Undo changes.
135 return variable_injector