1 # Based on GardenSnake - a parser generator demonstration program
2 # GardenSnake was released into the Public Domain by Andrew Dalke.
4 # Portions of this work are derived from Python's Grammar definition
5 # and may be covered under the Python copyright and license
7 # Andrew Dalke / Dalke Scientific Software, LLC
8 # 30 August 2006 / Cape Town, South Africa
10 # Modifications for inclusion in PLY distribution
12 from pprint
import pprint
14 from ply
import lex
, yacc
17 from soc
.decoder
.power_decoder
import create_pdecode
18 from nmigen
.back
.pysim
import Simulator
, Delay
19 from nmigen
import Module
, Signal
21 from soc
.decoder
.pseudo
.lexer
import IndentLexer
22 from soc
.decoder
.pseudo
.parser
import GardenSnakeCompiler
24 ####### Test code #######
29 index <- (RS)[8*i:8*i+7]
30 RA <- [0]*56 || perm[0:7]
35 if index < 64 then index <- 0
46 index <- (RS)[8*i:8*i+7]
51 RA <- [0]*56|| perm[0:7]
57 if (RS)[63-n] = 0b1 then
68 #lexer = IndentLexer(debug=1)
69 # Give the lexer some input
86 l
.append(1 if (num
& (1<<i
)) else 0)
92 report
= ''.join(map(str, reg
))
93 return hex(int('0b%s' % report
, 2))
96 gsc
= GardenSnakeCompiler()
98 def __init__(self
, sd
, regfile
):
101 self
.regfile
= regfile
105 def set_form(self
, form
):
108 def ___getitem__(self
, attr
):
109 print ("GPR getitem", attr
)
110 getform
= self
.sd
.sigforms
[self
.form
]
111 rnum
= getattr(getform
, attr
)
112 print ("GPR get", rnum
, rnum
, dir(rnum
))
114 print (l
[0]._as
_const
())
116 #print (x, x.value, dir(x))
117 #print (x.value, dir(x.value))
119 return self
.regfile
[rnum
]
125 gsc
.gpr
= GPR(gsc
.parser
.sd
, gsc
.regfile
)
127 _compile
= gsc
.compile
130 tree
= _compile(code
, mode
="single", filename
="string")
132 tree
= ast
.fix_missing_locations(tree
)
133 print ( ast
.dump(tree
) )
136 print (astor
.dump_tree(tree
))
138 source
= astor
.to_source(tree
)
143 # Set up the GardenSnake run-time environment
146 print ("-->", " ".join(map(str,args
)))
148 def listconcat(l1
, l2
):
151 from soc
.decoder
.helpers
import (EXTS64
, EXTZ64
, ROTL64
, ROTL32
, MASK
,)
157 d
["concat"] = listconcat
161 gsc
.gpr
.set_form(form
)
162 getform
= gsc
.parser
.sd
.sigforms
[form
]._asdict
()
163 #print ("getform", form)
164 #for k, f in getform.items():
168 compiled_code
= compile(source
, mode
="exec", filename
="<string>")
172 instruction
= Signal(32)
174 m
.submodules
.decode
= decode
= gsc
.parser
.sd
175 comb
+= decode
.raw_opcode_in
.eq(instruction
)
182 print("0x{:X}".format(ins
& 0xffffffff))
184 # ask the decoder to decode this binary data (endian'd)
185 yield decode
.bigendian
.eq(0) # little / big?
186 yield instruction
.eq(ins
) # raw binary instr.
189 # read regs, drop them into dict for function
190 for rname
in gsc
.parser
.read_regs
:
191 regidx
= yield getattr(decode
.sigforms
['X'], rname
)
192 d
[rname
] = gsc
.gpr
[regidx
]
193 print ("read reg", rname
, regidx
, get_reg_hex(d
[rname
]))
195 exec (compiled_code
, d
)
200 print (decode
.sigforms
['X'])
201 x
= yield decode
.sigforms
['X'].RS
202 ra
= yield decode
.sigforms
['X'].RA
203 print ("RA", ra
, d
['RA'])
206 for wname
in gsc
.parser
.write_regs
:
208 print ("write regs", wname
, d
[wname
], reg
)
210 gsc
.gpr
[regidx
] = tolist(d
[wname
])
212 sim
.add_process(process
)
213 with sim
.write_vcd("simulator.vcd", "simulator.gtkw",
214 traces
=[decode
.ports()]):
217 for i
in range(len(gsc
.gpr
)):
218 print ("regfile", i
, get_reg_hex(gsc
.gpr
[i
]))
221 if __name__
== '__main__':