Skip to content

Commit c6f3858

Browse files
committed
supply is supported in dataflow analyzer.
1 parent 7442143 commit c6f3858

File tree

7 files changed

+191
-151
lines changed

7 files changed

+191
-151
lines changed

pyverilog/dataflow/bindvisitor.py

Lines changed: 106 additions & 100 deletions
Large diffs are not rendered by default.

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))

pyverilog/testcode/supply.v

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//`default_nettype none
2+
3+
module TOP(CLK, RST);
4+
input CLK, RST;
5+
parameter AAA = 1;
6+
supply0 VSS;
7+
supply1 VDD;
8+
9+
endmodule
10+

pyverilog/testcode/test_sd.py

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,12 @@
2020

2121
class TestSequenceFunctions(unittest.TestCase):
2222
def setUp(self):
23-
path_clone = sys.path
24-
pop_target = []
25-
for i,path in enumerate(path_clone):
26-
if path == 'C:\\Python27\\lib\\site-packages\\pyverilog-0.9.0-py2.7.egg':
27-
pop_target.append(i)
28-
for i in reversed(pop_target):
29-
sys.path.pop(i)
30-
reload(pyverilog.dataflow.dataflow_analyzer)
23+
pass
24+
25+
def test_supply(self):
26+
terms, binddict = self.dataflow_wrapper("supply.v")
27+
expect_bind = set(['(Bind dest:TOP.AAA tree:(IntConst 1))','(Bind dest:TOP.VDD tree:(IntConst 1))','(Bind dest:TOP.VSS tree:(IntConst 0))'])
28+
self.assertEqual(self.binddict2strset(binddict), expect_bind)
3129

3230
def test_signed(self):
3331
terms, binddict = self.dataflow_wrapper("signed.v")
@@ -104,5 +102,11 @@ def dataflow_wrapper(self,code_file):
104102

105103
return terms, binddict
106104

105+
def binddict2strset(self, binddict):
106+
bind_set = set([])
107+
for item in binddict.items():
108+
bind_set.add(item[1][0])
109+
return set([bind.tostr() for bind in bind_set])
110+
107111
if __name__ == '__main__':
108112
unittest.main()

pyverilog/vparser/ast.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ def children(self):
231231
if self.width: nodelist.append(self.width)
232232
return tuple(nodelist)
233233
class Localparam(Parameter): pass
234+
class Supply(Parameter) : pass
234235

235236
class Decl(Node):
236237
attr_names = ()

pyverilog/vparser/lexer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def token(self):
4848
'MODULE', 'ENDMODULE', 'BEGIN', 'END', 'GENERATE', 'ENDGENERATE', 'GENVAR',
4949
'FUNCTION', 'ENDFUNCTION', 'TASK', 'ENDTASK',
5050
'INPUT', 'INOUT', 'OUTPUT', 'TRI', 'REG', 'WIRE', 'INTEGER', 'REAL', 'SIGNED',
51-
'PARAMETER', 'LOCALPARAM',
51+
'PARAMETER', 'LOCALPARAM', 'SUPPLY0', 'SUPPLY1',
5252
'ASSIGN', 'ALWAYS', 'SENS_OR', 'POSEDGE', 'NEGEDGE', 'INITIAL',
5353
'IF', 'ELSE', 'FOR', 'WHILE', 'CASE', 'CASEX', 'ENDCASE', 'DEFAULT',
5454
'WAIT', 'FOREVER', 'DISABLE', 'FORK', 'JOIN',

pyverilog/vparser/parser.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,14 @@ def p_sigtype_signed(self, p):
238238
'sigtype : SIGNED'
239239
p[0] = p[1]
240240

241+
def p_sigtype_supply0(self, p):
242+
'sigtype : SUPPLY0'
243+
p[0] = p[1]
244+
245+
def p_sigtype_supply1(self, p):
246+
'sigtype : SUPPLY1'
247+
p[0] = p[1]
248+
241249
def p_ioports(self, p):
242250
'ioports : ioports COMMA ioport'
243251
if isinstance(p[3], str):
@@ -396,6 +404,10 @@ def decl_create(self, sigtypes, name, width=None, length=None):
396404
decls.append( Reg(name=name, width=width, signed=signed) )
397405
if 'tri' in sigtypes:
398406
decls.append( Tri(name=name, width=width, signed=signed) )
407+
if 'supply0' in sigtypes:
408+
decls.append( Supply(name=name,value=IntConst('0'), width=width, signed=signed) )
409+
if 'supply1' in sigtypes:
410+
decls.append( Supply(name=name,value=IntConst('1'), width=width, signed=signed) )
399411
return decls
400412

401413
def decl_typecheck(self, sigtypes, length=None):
@@ -488,6 +500,10 @@ def declassign_typecheck(self, sigtypes):
488500
raise ParseError("Syntax Error")
489501
if 'inout' in sigtypes and 'reg' in sigtypes:
490502
raise ParseError("Syntax Error")
503+
if 'supply0' in sigtypes and len(sigtypes) != 1:
504+
raise ParseError("Syntax Error")
505+
if 'supply1' in sigtypes and len(sigtypes) != 1:
506+
raise ParseError("Syntax Error")
491507

492508
def p_declassign(self, p):
493509
'declassign : sigtypes declassign_element SEMICOLON'

0 commit comments

Comments
 (0)