Skip to content

Commit e985b58

Browse files
committed
Merge pull request #7 from fukatani/sens_info
遅くなりましたがマージします.各種機能追加ありがとうございます
2 parents a8e3126 + 519a427 commit e985b58

File tree

10 files changed

+161
-77
lines changed

10 files changed

+161
-77
lines changed

pyverilog/dataflow/bindvisitor.py

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
# Binding visitor
55
#
66
# Copyright (C) 2013, Shinya Takamaeda-Yamazaki
7+
# edited by ryosuke fukatani
78
# License: Apache 2.0
89
#-------------------------------------------------------------------------------
910

@@ -108,6 +109,12 @@ def visit_Parameter(self, node):
108109
if len(self.dataflow.getBindlist(name)) == 0:
109110
self.addBind(node.name, node.value, bindtype='parameter')
110111

112+
def visit_Supply(self, node):
113+
self.addTerm(node)
114+
current = self.frames.getCurrent()
115+
name = current + ScopeLabel(node.name, 'signal')
116+
self.addBind(node.name, node.value, bindtype='parameter')
117+
111118
def visit_Localparam(self, node):
112119
self.addTerm(node)
113120
current = self.frames.getCurrent()
@@ -227,12 +234,12 @@ def visit_Always(self, node):
227234
generate=self.frames.isGenerate(),
228235
always=True)
229236

230-
(clock_name, clock_edge,
231-
reset_name, reset_edge,
237+
(clock_name, clock_edge, clock_bit,
238+
reset_name, reset_edge, reset_bit,
232239
senslist) = self._createAlwaysinfo(node, current)
233240

234-
self.frames.setAlwaysInfo(clock_name, clock_edge,
235-
reset_name, reset_edge, senslist)
241+
self.frames.setAlwaysInfo(clock_name, clock_edge, clock_bit,
242+
reset_name, reset_edge, reset_bit, senslist)
236243

237244
self.generic_visit(node)
238245
self.frames.setCurrent(current)
@@ -251,19 +258,28 @@ def _createAlwaysinfo(self, node, scope):
251258
senslist = []
252259
clock_edge = None
253260
clock_name = None
261+
clock_bit = None
254262
reset_edge = None
255263
reset_name = None
264+
reset_bit = None
256265

257266
for l in node.sens_list.list:
258267
if l.sig is None:
259268
continue
260-
signame = self._get_signal_name(l.sig)
269+
if isinstance(l.sig, pyverilog.vparser.ast.Pointer):
270+
signame = self._get_signal_name(l.sig.var)
271+
bit = int(l.sig.ptr.value)
272+
else:
273+
signame = self._get_signal_name(l.sig)
274+
bit = 0
261275
if signaltype.isClock(signame):
262-
clock_name = self.searchTerminal(l.sig.name, scope)
276+
clock_name = self.searchTerminal(signame, scope)
263277
clock_edge = l.type
278+
clock_bit = bit
264279
elif signaltype.isReset(signame):
265-
reset_name = self.searchTerminal(l.sig.name, scope)
280+
reset_name = self.searchTerminal(signame, scope)
266281
reset_edge = l.type
282+
reset_bit = bit
267283
else:
268284
senslist.append(l)
269285

@@ -272,7 +288,7 @@ def _createAlwaysinfo(self, node, scope):
272288
if reset_edge is not None and len(senslist) > 0:
273289
raise verror.FormatError('Illegal sensitivity list')
274290

275-
return (clock_name, clock_edge, reset_name, reset_edge, senslist)
291+
return (clock_name, clock_edge, clock_bit, reset_name, reset_edge, reset_bit, senslist)
276292

277293
def visit_IfStatement(self, node):
278294
if self.frames.isFunctiondef() and not self.frames.isFunctioncall(): return

pyverilog/dataflow/dataflow.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,12 +692,18 @@ def getClockName(self):
692692
def getClockEdge(self):
693693
if self.alwaysinfo is None: return ''
694694
return self.alwaysinfo.getClockEdge()
695+
def getClockBit(self):
696+
if self.alwaysinfo is None: return ''
697+
return self.alwaysinfo.getClockBit()
695698
def getResetName(self):
696699
if self.alwaysinfo is None: return ''
697700
return self.alwaysinfo.getResetName()
698701
def getResetEdge(self):
699702
if self.alwaysinfo is None: return ''
700703
return self.alwaysinfo.getResetEdge()
704+
def getResetBit(self):
705+
if self.alwaysinfo is None: return ''
706+
return self.alwaysinfo.getResetBit()
701707
def getSenslist(self):
702708
if self.alwaysinfo is None: return ''
703709
return self.alwaysinfo.getSenslist()

pyverilog/dataflow/signalvisitor.py

Lines changed: 45 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#-------------------------------------------------------------------------------
22
# signalvisitor.py
3-
#
3+
#
44
# Signal definition visitor
55
#
66
# Copyright (C) 2013, Shinya Takamaeda-Yamazaki
@@ -62,6 +62,9 @@ def visit_Reg(self, node):
6262
def visit_Wire(self, node):
6363
self.frames.addSignal(node)
6464

65+
def visit_Supply(self, node):
66+
self.frames.addSignal(node)
67+
6568
def visit_RegArray(self, node):
6669
self.frames.addSignal(node)
6770

@@ -87,7 +90,7 @@ def visit_Localparam(self, node):
8790
if not self.hasConstant(name):
8891
value = self.optimize(self.getTree(node.value, self.frames.getCurrent()))
8992
self.setConstant(name, value)
90-
93+
9194
def visit_Genvar(self, node):
9295
self.frames.addConst(node)
9396
name = self.frames.getCurrent() + ScopeLabel(node.name, 'signal')
@@ -110,7 +113,7 @@ def visit_Task(self, node):
110113
def visit_Initial(self, node):
111114
pass
112115
#label = self.labels.get( self.frames.getLabelKey('initial') )
113-
#current = self.frames.addFrame(ScopeLabel(label, 'initial'),
116+
#current = self.frames.addFrame(ScopeLabel(label, 'initial'),
114117
# generate=self.frames.isGenerate(),
115118
# initial=True)
116119
#self.generic_visit(node)
@@ -124,25 +127,25 @@ def visit_Instance(self, node):
124127
if node.array: return self._visit_Instance_array(node)
125128
nodename = node.name
126129
return self._visit_Instance_body(node, nodename)
127-
130+
128131
def _visit_Instance_array(self, node):
129132
if node.name == '':
130133
raise verror.FormatError("Module %s requires an instance name" % node.module)
131-
134+
132135
current = self.frames.getCurrent()
133136
msb = self.optimize(self.getTree(node.array.msb, current)).value
134137
lsb = self.optimize(self.getTree(node.array.lsb, current)).value
135-
138+
136139
for i in range(lsb, msb+1):
137140
nodename = node.name + '_' + str(i)
138141
self._visit_Instance_body(node, nodename)
139-
142+
140143
def _visit_Instance_body(self, node, nodename):
141144
if node.module in primitives: return self._visit_Instance_primitive(node)
142145

143146
if nodename == '':
144147
raise verror.FormatError("Module %s requires an instance name" % node.module)
145-
148+
146149
current = self.stackInstanceFrame(nodename, node.module)
147150

148151
self.setInstanceSimpleConstantTerms()
@@ -151,9 +154,9 @@ def _visit_Instance_body(self, node, nodename):
151154

152155
paramnames = self.moduleinfotable.getParamNames(node.module)
153156
for paramnames_i, param in enumerate(node.parameterlist):
154-
paramname = paramnames[paramnames_i] if param.paramname is None else param.paramname
157+
paramname = paramnames[paramnames_i] if param.paramname is None else param.paramname
155158
if paramname not in paramnames:
156-
raise verror.FormatError("No such parameter: %s in %s" %
159+
raise verror.FormatError("No such parameter: %s in %s" %
157160
(paramname, nodename))
158161
value = self.optimize(self.getTree(param.argname, current))
159162
name, definition = self.searchConstantDefinition(scope, paramname)
@@ -167,10 +170,10 @@ def _visit_Instance_body(self, node, nodename):
167170

168171
def _visit_Instance_primitive(self, node):
169172
pass
170-
173+
171174
def visit_Always(self, node):
172175
label = self.labels.get( self.frames.getLabelKey('always') )
173-
current = self.frames.addFrame(ScopeLabel(label, 'always'),
176+
current = self.frames.addFrame(ScopeLabel(label, 'always'),
174177
generate=self.frames.isGenerate(),
175178
always=True)
176179
self.generic_visit(node)
@@ -204,13 +207,13 @@ def _toELSE(self, label):
204207
def _if_true(self, node):
205208
if node.true_statement is None: return None
206209
label = self.labels.get( self.frames.getLabelKey('if') )
207-
current = self.frames.addFrame(ScopeLabel(label, 'if'),
210+
current = self.frames.addFrame(ScopeLabel(label, 'if'),
208211
frametype='ifthen',
209212
condition=node.cond,
210-
functioncall=self.frames.isFunctioncall(),
213+
functioncall=self.frames.isFunctioncall(),
211214
taskcall=self.frames.isTaskcall(),
212-
generate=self.frames.isGenerate(),
213-
always=self.frames.isAlways(),
215+
generate=self.frames.isGenerate(),
216+
always=self.frames.isAlways(),
214217
initial=self.frames.isInitial())
215218
self.visit(node.true_statement)
216219
self.frames.setCurrent(current)
@@ -221,8 +224,8 @@ def _if_false(self, node, label):
221224
label = self._toELSE(label)
222225
current = self.frames.addFrame(ScopeLabel(label, 'if'),
223226
frametype='ifelse',
224-
condition=node.cond,
225-
functioncall=self.frames.isFunctioncall(),
227+
condition=node.cond,
228+
functioncall=self.frames.isFunctioncall(),
226229
taskcall=self.frames.isTaskcall(),
227230
generate=self.frames.isGenerate(),
228231
always=self.frames.isAlways(),
@@ -242,31 +245,31 @@ def _case(self, comp, caselist):
242245
cond = IntConst('1')
243246
if case.cond is not None:
244247
if len(case.cond) > 1:
245-
cond = Eq(comp, case.cond[0])
248+
cond = Eq(comp, case.cond[0])
246249
for c in case.cond[1:]:
247250
cond = Lor(cond, Eq(comp, c))
248251
else:
249252
cond = Eq(comp, case.cond[0])
250253
label = self.labels.get( self.frames.getLabelKey('if') )
251-
current = self.frames.addFrame(ScopeLabel(label, 'if'),
254+
current = self.frames.addFrame(ScopeLabel(label, 'if'),
252255
frametype='ifthen',
253-
condition=cond,
254-
functioncall=self.frames.isFunctioncall(),
256+
condition=cond,
257+
functioncall=self.frames.isFunctioncall(),
255258
taskcall=self.frames.isTaskcall(),
256-
generate=self.frames.isGenerate(),
257-
always=self.frames.isAlways(),
259+
generate=self.frames.isGenerate(),
260+
always=self.frames.isAlways(),
258261
initial=self.frames.isInitial())
259262
if case.statement is not None: self.visit(case.statement)
260263
self.frames.setCurrent(current)
261264
if len(caselist) == 1: return
262265
label = self._toELSE(label)
263266
current = self.frames.addFrame(ScopeLabel(label, 'if'),
264-
frametype='ifelse',
265-
condition=cond,
266-
functioncall=self.frames.isFunctioncall(),
267+
frametype='ifelse',
268+
condition=cond,
269+
functioncall=self.frames.isFunctioncall(),
267270
taskcall=self.frames.isTaskcall(),
268-
generate=self.frames.isGenerate(),
269-
always=self.frames.isAlways(),
271+
generate=self.frames.isGenerate(),
272+
always=self.frames.isAlways(),
270273
initial=self.frames.isInitial())
271274
self._case(comp, caselist[1:])
272275

@@ -290,15 +293,15 @@ def visit_ForStatement(self, node):
290293
raise verror.FormatError(("Can not process the for-statement. "
291294
"for-condition should be evaluated statically."))
292295
# loop termination
293-
if rslt.value <= 0: break
296+
if rslt.value <= 0: break
294297

295298
## main-statement
296299
current = self.frames.addFrame(ScopeLabel(label, 'for', loop),
297-
frametype='for',
298-
functioncall=self.frames.isFunctioncall(),
300+
frametype='for',
301+
functioncall=self.frames.isFunctioncall(),
299302
taskcall=self.frames.isTaskcall(),
300-
generate=self.frames.isGenerate(),
301-
always=self.frames.isAlways(),
303+
generate=self.frames.isGenerate(),
304+
always=self.frames.isAlways(),
302305
initial=self.frames.isInitial(),
303306
loop=loop, loop_iter=self.frames.getForIter())
304307
self.visit(node.statement)
@@ -335,7 +338,7 @@ def visit_Block(self, node):
335338
functioncall=self.frames.isFunctioncall(),
336339
taskcall=self.frames.isTaskcall(),
337340
generate=self.frames.isGenerate(),
338-
always=self.frames.isAlways(),
341+
always=self.frames.isAlways(),
339342
initial=self.frames.isInitial())
340343
self.generic_visit(node)
341344
self.frames.setCurrent(current)
@@ -346,7 +349,7 @@ def visit_Assign(self, node):
346349
def visit_BlockingSubstitution(self, node):
347350
if self.frames.isForpre() or self.frames.isForpost():
348351
current = self.frames.getCurrent()
349-
name, definition = self.searchConstantDefinition(current,
352+
name, definition = self.searchConstantDefinition(current,
350353
node.left.var.name)
351354
value = self.optimize(self.getTree(node.right.var, current))
352355
self.setConstant(name, value)
@@ -387,7 +390,7 @@ def setInstanceConstantTerms(self):
387390
for definition in definitions:
388391
term = self.makeConstantTerm(name, definition, current)
389392
self.setConstantTerm(name, term)
390-
393+
391394
def setInstanceConstants(self):
392395
current = self.frames.getCurrent()
393396

@@ -425,7 +428,7 @@ def setConstantTerm(self, name, term):
425428

426429
def hasConstantTerm(self, name):
427430
self.optimizer.hasTerm(name)
428-
431+
429432
############################################################################
430433
def toScopeChain(self, blocklabel):
431434
scopelist = []
@@ -452,7 +455,7 @@ def searchConstantDefinition(self, key, name):
452455
foundkey, founddef = self.frames.searchSignalDefinition(key, name)
453456
if foundkey is not None:
454457
return foundkey + ScopeLabel(name, 'signal'), founddef
455-
if foundkey is None:
458+
if foundkey is None:
456459
raise verror.DefinitionError('constant value not found: %s' % name)
457460

458461
def searchScopeConstantValue(self, blocklabel, name):
@@ -482,7 +485,7 @@ def getTree(self, node, scope):
482485
def makeDFTree(self, node, scope):
483486
if isinstance(node, str):
484487
return self.searchConstantValue(scope, node)
485-
488+
486489
if isinstance(node, Identifier):
487490
if node.scope is not None:
488491
const = self.searchScopeConstantValue(node.scope, node.name)
@@ -532,8 +535,8 @@ def makeDFTree(self, node, scope):
532535
var_df = self.makeDFTree(node.var, scope)
533536
ptr_df = self.makeDFTree(node.ptr, scope)
534537

535-
if (isinstance(var_df, DFTerminal) and
536-
(signaltype.isRegArray(self.getTermtype(var_df.name)) or
538+
if (isinstance(var_df, DFTerminal) and
539+
(signaltype.isRegArray(self.getTermtype(var_df.name)) or
537540
signaltype.isWireArray(self.getTermtype(var_df.name)))):
538541
return DFPointer(var_df, ptr_df)
539542
return DFPartselect(var_df, ptr_df, copy.deepcopy(ptr_df))

0 commit comments

Comments
 (0)