Skip to content

Commit 9e9ec17

Browse files
committed
Merge branch 'master' of https://github.com/fukatani/Pyverilog-1 into work
Conflicts: pyverilog/testcode/test_sd.py
2 parents 454704a + d0dcfeb commit 9e9ec17

File tree

6 files changed

+75
-30
lines changed

6 files changed

+75
-30
lines changed

pyverilog/ast_code_generator/codegen.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,12 @@ def visit_Description(self, node):
6666
def visit_ModuleDef(self, node):
6767
filename = getfilename(node)
6868
template = self.env.get_template(filename)
69-
paramlist = self.visit(node.paramlist)
69+
paramlist = self.visit(node.paramlist) if node.paramlist is not None else ''
70+
portlist = self.visit(node.portlist) if node.portlist is not None else ''
7071
template_dict = {
7172
'modulename' : escape(node.name),
72-
'paramlist' : '' if len(node.paramlist.params) == 0 else paramlist,
73-
'portlist' : self.visit(node.portlist),
73+
'paramlist' : paramlist,
74+
'portlist' : portlist,
7475
'items' : [ self.visit(item) for item in node.items ],
7576
}
7677
rslt = template.render(template_dict)

pyverilog/dataflow/bindvisitor.py

Lines changed: 18 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

@@ -233,12 +234,12 @@ def visit_Always(self, node):
233234
generate=self.frames.isGenerate(),
234235
always=True)
235236

236-
(clock_name, clock_edge,
237-
reset_name, reset_edge,
237+
(clock_name, clock_edge, clock_bit,
238+
reset_name, reset_edge, reset_bit,
238239
senslist) = self._createAlwaysinfo(node, current)
239240

240-
self.frames.setAlwaysInfo(clock_name, clock_edge,
241-
reset_name, reset_edge, senslist)
241+
self.frames.setAlwaysInfo(clock_name, clock_edge, clock_bit,
242+
reset_name, reset_edge, reset_bit, senslist)
242243

243244
self.generic_visit(node)
244245
self.frames.setCurrent(current)
@@ -257,19 +258,28 @@ def _createAlwaysinfo(self, node, scope):
257258
senslist = []
258259
clock_edge = None
259260
clock_name = None
261+
clock_bit = None
260262
reset_edge = None
261263
reset_name = None
264+
reset_bit = None
262265

263266
for l in node.sens_list.list:
264267
if l.sig is None:
265268
continue
266-
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
267275
if signaltype.isClock(signame):
268-
clock_name = self.searchTerminal(l.sig.name, scope)
276+
clock_name = self.searchTerminal(signame, scope)
269277
clock_edge = l.type
278+
clock_bit = bit
270279
elif signaltype.isReset(signame):
271-
reset_name = self.searchTerminal(l.sig.name, scope)
280+
reset_name = self.searchTerminal(signame, scope)
272281
reset_edge = l.type
282+
reset_bit = bit
273283
else:
274284
senslist.append(l)
275285

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

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

283293
def visit_IfStatement(self, node):
284294
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/visit.py

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -54,21 +54,27 @@ def generic_visit(self, node):
5454
# Signal/Object Management Classes
5555
################################################################################
5656
class AlwaysInfo(object):
57-
def __init__(self, clock_name='', clock_edge=None,
58-
reset_name='', reset_edge=None, senslist=()):
57+
def __init__(self, clock_name='', clock_edge=None, clock_bit=0,
58+
reset_name='', reset_edge=None, reset_bit=0, senslist=()):
5959
self.clock_name = clock_name
6060
self.clock_edge = clock_edge
61+
self.clock_bit = clock_bit
6162
self.reset_name = reset_name
6263
self.reset_edge = reset_edge
64+
self.reset_bit = reset_bit
6365
self.senslist = senslist
6466
def getClockName(self):
6567
return self.clock_name
6668
def getClockEdge(self):
6769
return self.clock_edge
70+
def getClockBit(self):
71+
return self.clock_bit
6872
def getResetName(self):
6973
return self.reset_name
7074
def getResetEdge(self):
7175
return self.reset_edge
76+
def getResetBit(self):
77+
return self.reset_bit
7278
def isClockEdge(self):
7379
if self.clock_name != '' and self.clock_edge == 'posedge': return True
7480
if self.clock_name != '' and self.clock_edge == 'negedge': return True
@@ -316,10 +322,10 @@ def isInitial(self):
316322
def setNext(self, nextframe):
317323
self.next.append(nextframe)
318324

319-
def setAlwaysInfo(self, clock_name, clock_edge,
320-
reset_name, reset_edge, senslist):
321-
self.alwaysinfo = AlwaysInfo(clock_name, clock_edge,
322-
reset_name, reset_edge, senslist)
325+
def setAlwaysInfo(self, clock_name, clock_edge, clock_bit,
326+
reset_name, reset_edge, reset_bit, senslist):
327+
self.alwaysinfo = AlwaysInfo(clock_name, clock_edge, clock_bit,
328+
reset_name, reset_edge, reset_bit, senslist)
323329

324330
def addSignal(self, node):
325331
self.variables.addSignal(node.name, node)
@@ -415,10 +421,10 @@ def toScopeChain(self, scopename):
415421
if scopename is None: return self.current
416422
return self.current + scopename
417423

418-
def addFrame(self, scopename,
419-
frametype='none',
420-
alwaysinfo=None, condition=None,
421-
module=False, functioncall=False, taskcall=False,
424+
def addFrame(self, scopename,
425+
frametype='none',
426+
alwaysinfo=None, condition=None,
427+
module=False, functioncall=False, taskcall=False,
422428
generate=False, always=False, initial=False, loop=None, loop_iter=None,
423429
modulename=None):
424430

@@ -429,10 +435,10 @@ def addFrame(self, scopename,
429435
previous = self.current
430436
if len(previous) > 0:
431437
self.dict[previous].setNext(scopechain)
432-
self.dict[scopechain] = Frame(scopechain, previous, frametype=frametype,
433-
alwaysinfo=alwaysinfo, condition=condition,
434-
module=module, functioncall=functioncall,
435-
taskcall=taskcall, generate=generate,
438+
self.dict[scopechain] = Frame(scopechain, previous, frametype=frametype,
439+
alwaysinfo=alwaysinfo, condition=condition,
440+
module=module, functioncall=functioncall,
441+
taskcall=taskcall, generate=generate,
436442
always=always, initial=initial, loop=loop, loop_iter=loop_iter,
437443
modulename=modulename)
438444
self.current = scopechain
@@ -496,10 +502,10 @@ def setForIter(self, iter):
496502
def getForIter(self):
497503
return self.for_iter
498504

499-
def setAlwaysInfo(self, clock_name, clock_edge,
500-
reset_name, reset_edge, senslist):
501-
self.dict[self.current].setAlwaysInfo(clock_name, clock_edge,
502-
reset_name, reset_edge, senslist)
505+
def setAlwaysInfo(self, clock_name, clock_edge, clock_bit,
506+
reset_name, reset_edge, reset_bit, senslist):
507+
self.dict[self.current].setAlwaysInfo(clock_name, clock_edge, clock_bit,
508+
reset_name, reset_edge, reset_bit, senslist)
503509

504510
def setCurrent(self, current):
505511
self.current = current
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//`default_nettype none
2+
3+
module TOP(CLK,RST);
4+
input [3:1] CLK;
5+
input [1:0] RST;
6+
reg cnt;
7+
8+
9+
always @(posedge CLK[2] or posedge RST[0]) begin
10+
if(RST[0]) begin
11+
cnt <= 'd0;
12+
end
13+
end
14+
15+
endmodule
16+
17+

pyverilog/testcode/test_sd.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,17 @@ def test_signed_task(self):
4040
def test_casex(self):
4141
self.dataflow_wrapper("casex.v")
4242

43+
def test_ptr_clock_reset(self):
44+
terms, binddict = self.dataflow_wrapper("ptr_clock_reset.v")
45+
self.assertEqual(binddict.values()[0][0].getClockBit(), 2)
46+
self.assertEqual(binddict.values()[0][0].getResetBit(), 0)
47+
4348
def test_decimal(self):
4449
terms, binddict = self.dataflow_wrapper("decimal.v")
4550
self.assertEqual(binddict.values()[0][0].tostr(),
4651
"(Bind dest:TOP.cnt1 tree:(Branch Cond:(Terminal TOP.RST) True:(IntConst 'd0) False:(Operator Plus Next:(Terminal TOP.cnt1),(IntConst 8'd1))))")
4752

48-
def test_decimal2(self):
53+
def test_ptr_clock_reset(self):
4954
terms, binddict = self.dataflow_wrapper("decimal2.v")
5055
self.assertEqual(binddict.values()[0][0].tostr(),
5156
"(Bind dest:TOP.cnt2 tree:(Branch Cond:(Terminal TOP.RST) True:(IntConst 'd0) False:(Operator Plus Next:(Terminal TOP.cnt2),(IntConst 'd1))))")

0 commit comments

Comments
 (0)