Skip to content

Commit 7fbc435

Browse files
committed
lib modules are refactored.
1 parent ff0e9da commit 7fbc435

File tree

3 files changed

+218
-220
lines changed

3 files changed

+218
-220
lines changed

veriloggen/lib/fsm.py

Lines changed: 115 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ def __init__(self, m, name, width=32, initname='init'):
2020
self.state = self.m.Reg(name, width) # set initval later
2121

2222
self.mark = {} # key:index
23-
self.set_mark(0, self.name + '_' + initname)
24-
self.state.initval = self.get_mark(0)
23+
self._set_mark(0, self.name + '_' + initname)
24+
self.state.initval = self._get_mark(0)
2525

2626
self.body = collections.defaultdict(list)
2727
self.delay_amount = 0
@@ -38,36 +38,17 @@ def __init__(self, m, name, width=32, initname='init'):
3838

3939
#---------------------------------------------------------------------------
4040
def current(self):
41-
return self.get_index()
41+
return self._get_index()
4242

4343
def next(self):
44-
return self.get_index() + 1
44+
return self._get_index() + 1
4545

46-
#---------------------------------------------------------------------------
4746
def increment(self):
48-
self.set_index(None)
47+
self._set_index(None)
4948

5049
def inc(self):
5150
self.increment()
5251

53-
#---------------------------------------------------------------------------
54-
def set(self, index=None):
55-
if index is None: index = self.current() + 1
56-
if isinstance(index, vtypes.Localparam):
57-
index = self.get_mark_index(index)
58-
if index not in self.mark:
59-
self.set_mark(index)
60-
return self.state( self.mark[index] )
61-
62-
def set_init(self):
63-
return [ self.set(0) ] + self.init_delayed_state()
64-
65-
def set_next(self):
66-
return self.set(None)
67-
68-
def reset(self):
69-
return self.set_init()
70-
7152
#---------------------------------------------------------------------------
7253
def goto(self, index=None, cond=None, else_index=None):
7354
g = self.set(index)
@@ -88,54 +69,27 @@ def goto_next(self, cond=None):
8869
return self
8970

9071
#---------------------------------------------------------------------------
91-
def prev(self, var, delay, initval=0):
92-
return self.seq.prev(var, delay, initval)
93-
94-
#---------------------------------------------------------------------------
95-
def add_dst_var(self, statement):
96-
for s in statement:
97-
values = self.dst_visitor.visit(s)
98-
for v in values:
99-
k = str(v)
100-
if k not in self.dst_var:
101-
self.dst_var[k] = v
102-
103-
#---------------------------------------------------------------------------
104-
def add_delayed_cond(self, statement, index, delay):
105-
name_prefix = '_'.join(['', self.name, 'cond', str(index), str(self.tmp_count)])
106-
self.tmp_count += 1
107-
prev = statement
108-
for i in range(delay):
109-
tmp_name = '_'.join([name_prefix, str(i+1)])
110-
tmp = self.m.Reg(tmp_name, initval=0)
111-
self.add(tmp(prev), delay=i)
112-
prev = tmp
113-
return prev
72+
def set(self, index=None):
73+
if index is None: index = self.current() + 1
74+
if isinstance(index, vtypes.Localparam):
75+
index = self._get_mark_index(index)
76+
if index not in self.mark:
77+
self._set_mark(index)
78+
return self.state( self.mark[index] )
79+
80+
def set_init(self):
81+
return [ self.set(0) ] + self._init_delayed_state()
82+
83+
def set_next(self):
84+
return self.set(None)
85+
86+
def reset(self):
87+
return self.set_init()
11488

11589
#---------------------------------------------------------------------------
116-
def add_delayed_subst(self, subst, index, delay):
117-
if not isinstance(subst, vtypes.Subst):
118-
return subst
119-
left = subst.left
120-
right = subst.right
121-
if isinstance(right, (bool, int, float, str,
122-
vtypes._Constant, vtypes._ParameterVairable)):
123-
return subst
124-
width = left.bit_length()
125-
prev = right
90+
def prev(self, var, delay, initval=0):
91+
return self.seq.prev(var, delay, initval)
12692

127-
name_prefix = ('_'.join(['', left.name, str(index), str(self.tmp_count)])
128-
if isinstance(left, vtypes._Variable) else
129-
'_'.join(['', self.name, 'sbst', str(index), str(self.tmp_count)]))
130-
self.tmp_count += 1
131-
132-
for i in range(delay):
133-
tmp_name = '_'.join([name_prefix, str(i+1)])
134-
tmp = self.m.Reg(tmp_name, width, initval=0)
135-
self.add(tmp(prev), delay=i)
136-
prev = tmp
137-
return left(prev)
138-
13993
#---------------------------------------------------------------------------
14094
def add(self, *statement, **kwargs):
14195
for k in kwargs.keys():
@@ -156,40 +110,50 @@ def add(self, *statement, **kwargs):
156110
return self
157111

158112
if delay is not None and delay > 0:
159-
self.add_delayed_state(delay)
113+
self._add_delayed_state(delay)
160114
index = self.current()
161115
if eager_val:
162-
statement = [ self.add_delayed_subst(s, index, delay) for s in statement ]
116+
statement = [ self._add_delayed_subst(s, index, delay) for s in statement ]
163117
if cond is not None:
164118
if not lazy_cond:
165-
cond = self.add_delayed_cond(cond, index, delay)
119+
cond = self._add_delayed_cond(cond, index, delay)
166120
statement = [ vtypes.If(cond)(*statement) ]
167121
self.delayed_body[delay][index].extend(statement)
168-
self.add_dst_var(statement)
122+
self._add_dst_var(statement)
169123
return self
170124

171125
if cond is not None:
172126
statement = [ vtypes.If(cond)(*statement) ]
173127

174128
index = self.current()
175129
self.body[index].extend(statement)
176-
self.add_dst_var(statement)
130+
self._add_dst_var(statement)
177131
return self
178132

133+
#---------------------------------------------------------------------------
134+
def make_always(self, clk, rst, reset=(), body=(), case=True):
135+
self.m.Always(vtypes.Posedge(clk))(
136+
vtypes.If(rst)(
137+
self.make_reset(reset)
138+
)(
139+
body,
140+
self.make_case() if case else self.make_if()
141+
))
142+
179143
#---------------------------------------------------------------------------
180144
def make_case(self):
181145
ret = []
182146
ret.extend( self.seq.make_code() )
183-
ret.extend( self.get_delayed_substs() )
147+
ret.extend( self._get_delayed_substs() )
184148

185149
for delay, dct in sorted(self.delayed_body.items(),
186150
key=lambda x:x[0], reverse=True):
187-
body = tuple([ self.get_delayed_when_statement(index, delay)
151+
body = tuple([ self._get_delayed_when_statement(index, delay)
188152
for index in sorted(dct.keys(), key=lambda x:x) ])
189-
case = vtypes.Case(self.get_delayed_state(delay))(*body)
153+
case = vtypes.Case(self._get_delayed_state(delay))(*body)
190154
ret.append(case)
191155

192-
body = tuple([ self.get_when_statement(index)
156+
body = tuple([ self._get_when_statement(index)
193157
for index in sorted(self.body.keys(), key=lambda x:x) ])
194158
case = vtypes.Case(self.state)(*body)
195159
ret.append(case)
@@ -199,14 +163,14 @@ def make_case(self):
199163
def make_if(self):
200164
ret = []
201165
ret.extend( self.seq.make_code() )
202-
ret.extend( self.get_delayed_substs() )
166+
ret.extend( self._get_delayed_substs() )
203167

204168
for delay, dct in sorted(self.delayed_body.items(),
205169
key=lambda x:x[0], reverse=True):
206-
ret.append([ self.get_delayed_if_statement(index, delay)
170+
ret.append([ self._get_delayed_if_statement(index, delay)
207171
for index in sorted(dct.keys(), key=lambda x:x) ])
208172

209-
ret.extend([ self.get_if_statement(index)
173+
ret.extend([ self._get_if_statement(index)
210174
for index in sorted(self.body.keys(), key=lambda x:x) ])
211175
return tuple(ret)
212176

@@ -250,48 +214,83 @@ def make_reset(self, reset):
250214
return list(ret.values())
251215

252216
#---------------------------------------------------------------------------
253-
def make_always(self, clk, rst, reset=(), body=(), case=True):
254-
self.m.Always(vtypes.Posedge(clk))(
255-
vtypes.If(rst)(
256-
self.make_reset(reset)
257-
)(
258-
body,
259-
self.make_case() if case else self.make_if()
260-
))
217+
def _add_dst_var(self, statement):
218+
for s in statement:
219+
values = self.dst_visitor.visit(s)
220+
for v in values:
221+
k = str(v)
222+
if k not in self.dst_var:
223+
self.dst_var[k] = v
224+
225+
#---------------------------------------------------------------------------
226+
def _add_delayed_cond(self, statement, index, delay):
227+
name_prefix = '_'.join(['', self.name, 'cond', str(index), str(self.tmp_count)])
228+
self.tmp_count += 1
229+
prev = statement
230+
for i in range(delay):
231+
tmp_name = '_'.join([name_prefix, str(i+1)])
232+
tmp = self.m.Reg(tmp_name, initval=0)
233+
self.add(tmp(prev), delay=i)
234+
prev = tmp
235+
return prev
261236

262237
#---------------------------------------------------------------------------
263-
def get_index(self):
238+
def _add_delayed_subst(self, subst, index, delay):
239+
if not isinstance(subst, vtypes.Subst):
240+
return subst
241+
left = subst.left
242+
right = subst.right
243+
if isinstance(right, (bool, int, float, str,
244+
vtypes._Constant, vtypes._ParameterVairable)):
245+
return subst
246+
width = left.bit_length()
247+
prev = right
248+
249+
name_prefix = ('_'.join(['', left.name, str(index), str(self.tmp_count)])
250+
if isinstance(left, vtypes._Variable) else
251+
'_'.join(['', self.name, 'sbst', str(index), str(self.tmp_count)]))
252+
self.tmp_count += 1
253+
254+
for i in range(delay):
255+
tmp_name = '_'.join([name_prefix, str(i+1)])
256+
tmp = self.m.Reg(tmp_name, width, initval=0)
257+
self.add(tmp(prev), delay=i)
258+
prev = tmp
259+
return left(prev)
260+
261+
#---------------------------------------------------------------------------
262+
def _get_index(self):
264263
return self.state_count
265264

266-
def set_index(self, index=None):
265+
def _set_index(self, index=None):
267266
if index is None:
268267
self.state_count += 1
269268
return self.state_count
270269
self.state_count = index
271270
return self.state_count
272271

273-
def get_mark(self, index=None):
272+
def _get_mark(self, index=None):
274273
if index is None:
275274
index = self.state_count
276275
if index not in self.mark:
277276
raise KeyError("No such index in FSM marks: %s" % index)
278277
return self.mark[index]
279278

280-
def set_mark(self, index=None, name=None):
279+
def _set_mark(self, index=None, name=None):
281280
if index is None:
282281
index = self.state_count
283282
if name is None:
284283
name = self.name + '_' + str(index)
285284
self.mark[index] = self.m.Localparam(name, index)
286285

287-
def get_mark_index(self, s):
286+
def _get_mark_index(self, s):
288287
for index, m in self.mark.items():
289288
if m.name == s.name:
290289
return index
291290
raise KeyError("No such mark in FSM marks: %s" % s.name)
292291

293292
#---------------------------------------------------------------------------
294-
def add_delayed_state(self, value):
293+
def _add_delayed_state(self, value):
295294
if not isinstance(value, int):
296295
raise TypeError("Delay amount must be int, not '%s'" % str(type(value)))
297296

@@ -302,66 +301,65 @@ def add_delayed_state(self, value):
302301
return self.state
303302

304303
if value <= self.delay_amount:
305-
return self.get_delayed_state(value)
304+
return self._get_delayed_state(value)
306305

307306
for i in range(self.delay_amount+1, value+1):
308307
d = self.m.Reg(''.join(['_d', str(i), '_', self.name]), self.width,
309-
initval=self.get_mark(0))
308+
initval=self._get_mark(0))
310309
self.delayed_state[i] = d
311-
###self.add_dst_var( [d] )
312310

313311
self.delay_amount = value
314312
return d
315313

316-
def get_delayed_state(self, value):
314+
def _get_delayed_state(self, value):
317315
if value == 0: return self.state
318316
if value not in self.delayed_state:
319317
raise IndexError('No such index %d in delayed state' % value)
320318
return self.delayed_state[value]
321319

322-
def get_delayed_substs(self):
320+
def _get_delayed_substs(self):
323321
ret = []
324322
prev = self.state
325323
for d in range(1, self.delay_amount+1):
326324
ret.append(vtypes.Subst(self.delayed_state[d], prev))
327325
prev = self.delayed_state[d]
328326
return ret
329327

330-
def init_delayed_state(self):
328+
def _init_delayed_state(self):
331329
ret = []
332330
for d in range(1, self.delay_amount+1):
333331
ret.append(vtypes.Subst(self.delayed_state[d], self.mark[0]))
334332
return ret
335333

336334
#---------------------------------------------------------------------------
337-
def cond_case(self, index):
335+
def _cond_case(self, index):
338336
if index not in self.mark:
339-
self.set_mark(index)
337+
self._set_mark(index)
340338
return self.mark[index]
341339

342-
def cond_if(self, index):
340+
def _cond_if(self, index):
343341
if index not in self.mark:
344-
self.set_mark(index)
342+
self._set_mark(index)
345343
return (self.state == self.mark[index])
346344

347-
def delayed_cond_if(self, index, delay):
345+
def _delayed_cond_if(self, index, delay):
348346
if index not in self.mark:
349-
self.set_mark(index)
347+
self._set_mark(index)
350348
if delay > 0 and delay not in self.delayed_state:
351-
self.add_delayed_state(delay)
352-
return (self.get_delayed_state(delay) == self.mark[index])
349+
self._add_delayed_state(delay)
350+
return (self._get_delayed_state(delay) == self.mark[index])
353351

354-
def get_when_statement(self, index):
355-
return vtypes.When(self.cond_case(index))( *self.body[index] )
352+
def _get_when_statement(self, index):
353+
return vtypes.When(self._cond_case(index))( *self.body[index] )
356354

357-
def get_delayed_when_statement(self, index, delay):
358-
return vtypes.When(self.cond_case(index))( *self.delayed_body[delay][index] )
355+
def _get_delayed_when_statement(self, index, delay):
356+
return vtypes.When(self._cond_case(index))( *self.delayed_body[delay][index] )
359357

360-
def get_if_statement(self, index):
361-
return vtypes.If(self.cond_if(index))( *self.body[index] )
358+
def _get_if_statement(self, index):
359+
return vtypes.If(self._cond_if(index))( *self.body[index] )
362360

363-
def get_delayed_if_statement(self, index, delay):
364-
return vtypes.If(self.delayed_cond_if(index, delay))( *self.delayed_body[delay][index] )
361+
def _get_delayed_if_statement(self, index, delay):
362+
return vtypes.If(self._delayed_cond_if(index, delay))( *self.delayed_body[delay][index] )
365363

366364
#---------------------------------------------------------------------------
367365
def __call__(self, *statement, **kwargs):
@@ -372,4 +370,3 @@ def __getitem__(self, index):
372370

373371
def __len__(self):
374372
return self.state_count + 1
375-

0 commit comments

Comments
 (0)