Skip to content

Commit 3e2e70e

Browse files
committed
Merge branch 'develop'
2 parents fa3ec32 + a03b4d0 commit 3e2e70e

File tree

5 files changed

+59
-21
lines changed

5 files changed

+59
-21
lines changed

veriloggen/core/module.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,6 +1069,15 @@ def add_object(self, obj):
10691069
self.generate[obj.true_scope] = obj
10701070
return
10711071

1072+
if isinstance(obj, GenerateIfElse):
1073+
if obj.false_scope is None:
1074+
if None not in self.generate:
1075+
self.generate[None] = []
1076+
self.generate[None].append(obj)
1077+
return
1078+
self.generate[obj.false_scope] = obj
1079+
return
1080+
10721081
if isinstance(obj, Instance):
10731082
if isinstance(obj.module, Module):
10741083
self.instance[obj.instname] = obj

veriloggen/core/vtypes.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2099,7 +2099,11 @@ def __init__(self, *args):
20992099
raise ValueError("Scope requires at least one argument.")
21002100

21012101
def bit_length(self):
2102-
return self.args[-1].bit_length()
2102+
try:
2103+
w = self.args[-1].bit_length()
2104+
return w
2105+
except:
2106+
raise ValueError('could not identify bit_length.')
21032107

21042108

21052109
class SystemTask(_Numeric):

veriloggen/resolver/resolver.py

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ def __init__(self, const_dict):
104104
_CommonVisitor.__init__(self)
105105
self.const_dict = const_dict
106106

107-
#-------------------------------------------------------------------------
107+
# -------------------------------------------------------------------------
108108
def get_const(self, name):
109109
if name not in self.const_dict:
110110
raise KeyError("No such constant: '%s'" % name)
@@ -119,7 +119,7 @@ def update_const(self, name, value):
119119
def get_const_dict(self):
120120
return self.const_dict
121121

122-
#-------------------------------------------------------------------------
122+
# -------------------------------------------------------------------------
123123
def _visit_param(self, node):
124124
if self.has_const(node.name):
125125
value = self.get_const(node.name)
@@ -136,7 +136,7 @@ def visit_Localparam(self, node):
136136
def visit_AnyType(self, node):
137137
return self._visit_param(node)
138138

139-
#-------------------------------------------------------------------------
139+
# -------------------------------------------------------------------------
140140
def visit__BinaryOperator(self, node):
141141
left = self.visit(node.left)
142142
right = self.visit(node.right)
@@ -157,7 +157,7 @@ def visit__UnaryOperator(self, node):
157157
return node.op(right, rwidth)
158158
return node
159159

160-
#-------------------------------------------------------------------------
160+
# -------------------------------------------------------------------------
161161
def visit_Pointer(self, node):
162162
var = self.visit(node.var)
163163
pos = self.visit(node.pos)
@@ -215,7 +215,7 @@ def visit_tuple(self, node):
215215
def visit_list(self, node):
216216
return [self.visit(n) for n in node]
217217

218-
#-------------------------------------------------------------------------
218+
# -------------------------------------------------------------------------
219219
def visit__BinaryOperator(self, node):
220220
left = self.visit(node.left)
221221
right = self.visit(node.right)
@@ -311,7 +311,7 @@ def visit_Cond(self, node):
311311
node.false_value = false_value
312312
return node
313313

314-
#-------------------------------------------------------------------------
314+
# -------------------------------------------------------------------------
315315
def visit_Posedge(self, node):
316316
name = self.visit(node.name)
317317
if check_overwrite(name):
@@ -327,7 +327,7 @@ def visit_Negedge(self, node):
327327
def visit_SensitiveAll(self, node):
328328
return node
329329

330-
#-------------------------------------------------------------------------
330+
# -------------------------------------------------------------------------
331331
def visit_Subst(self, node):
332332
left = self.visit(node.left)
333333
right = self.visit(node.right)
@@ -342,7 +342,7 @@ def visit_Subst(self, node):
342342
node.rdelay = rdelay
343343
return node
344344

345-
#-------------------------------------------------------------------------
345+
# -------------------------------------------------------------------------
346346
def visit_If(self, node):
347347
condition = self.visit(node.condition)
348348
true_statement = self.visit(node.true_statement)
@@ -665,12 +665,14 @@ def visit_Instance(self, node):
665665
return node
666666

667667
def visit_GenerateFor(self, node):
668-
raise NotImplementedError(
669-
"GenerateFor statement is not currently supported.")
668+
# raise NotImplementedError(
669+
# "GenerateFor statement is not currently supported.")
670+
return node
670671

671672
def visit_GenerateIf(self, node):
672-
raise NotImplementedError(
673-
"GenerateIf statement is not currently supported.")
673+
# raise NotImplementedError(
674+
# "GenerateIf statement is not currently supported.")
675+
return node
674676

675677

676678
def resolve(m, const_dict=None):

veriloggen/verilog/from_verilog.py

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
from pyverilog.ast_code_generator.codegen import ASTCodeGenerator
1717

1818

19-
#-------------------------------------------------------------------------
19+
# -------------------------------------------------------------------------
2020
# User interfaces to read Verilog source code
21-
#-------------------------------------------------------------------------
21+
# -------------------------------------------------------------------------
2222
def read_verilog_stubmodule(*filelist, **opt):
2323
module_dict = to_module_dict(*filelist, **opt)
2424
codegen = ASTCodeGenerator()
@@ -60,7 +60,7 @@ def read_verilog_stubmodule_str(code, encode='utf-8'):
6060
return ret
6161

6262

63-
#-------------------------------------------------------------------------
63+
# -------------------------------------------------------------------------
6464
def to_module_dict(*filelist, **opt):
6565
ast = to_ast(*filelist, **opt)
6666

@@ -75,7 +75,7 @@ def to_module_dict(*filelist, **opt):
7575
return module_dict
7676

7777

78-
#-------------------------------------------------------------------------
78+
# -------------------------------------------------------------------------
7979
def to_ast(*filelist, **opt):
8080
include = opt['include'] if 'include' in opt else ()
8181
define = opt['define'] if 'define' in opt else ()
@@ -94,14 +94,14 @@ def to_ast(*filelist, **opt):
9494
return ast
9595

9696

97-
#-------------------------------------------------------------------------
97+
# -------------------------------------------------------------------------
9898
def to_tuple(s):
9999
if not isinstance(s, (list, tuple)):
100100
return tuple([s])
101101
return s
102102

103103

104-
#-------------------------------------------------------------------------
104+
# -------------------------------------------------------------------------
105105
class ReadOnlyModule(object):
106106

107107
def __init__(self, m):
@@ -111,7 +111,7 @@ def __getattr__(self, attr):
111111
return getattr(self.m, attr)
112112

113113

114-
#-------------------------------------------------------------------------
114+
# -------------------------------------------------------------------------
115115
class VerilogReadVisitor(object):
116116

117117
def __init__(self, ast_module_dict, converted_modules=None):
@@ -217,10 +217,29 @@ def visit_Length(self, node):
217217
def visit_Identifier(self, node):
218218
if node.scope is not None:
219219
labels = self.visit(node.scope)
220-
labels.append(node.name)
220+
221+
if not isinstance(self.m, (module.Module, ReadOnlyModule)):
222+
lables.append(vtypes.AnyType(name=node.name))
223+
return vtypes.Scope(*labels)
224+
225+
m = self.m
226+
for label in labels:
227+
name = label.name if isinstance(label, vtypes.ScopeIndex) else label
228+
m = m.find_identifier(name)
229+
230+
v = m.find_identifier(node.name)
231+
if v is None:
232+
labels.append(vtypes.AnyType(name=node.name))
233+
elif v.name in m.variable:
234+
labels.append(m.variable[v.name])
235+
else:
236+
labels.append(v)
237+
221238
return vtypes.Scope(*labels)
239+
222240
if not isinstance(self.m, (module.Module, ReadOnlyModule)):
223241
return vtypes.AnyType(name=node.name)
242+
224243
ret = self.m.find_identifier(node.name)
225244
if ret is None:
226245
return vtypes.AnyType(name=node.name)
@@ -892,6 +911,7 @@ def _visit_GenerateIf(self, item):
892911
statement = self.visit(item.true_statement)
893912
self.pop_module()
894913
_if_false = _if_true.Else(false_scope)
914+
self.add_object(_if_false)
895915
self.push_module(_if_false)
896916
statement = (self.visit(item.false_statement)
897917
if item.false_statement is not None else None)

veriloggen/verilog/to_verilog.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,9 @@ def visit_GenerateIf(self, node):
837837
_if = vast.IfStatement(cond, true_block, false_block)
838838
return vast.GenerateStatement(tuple([_if]))
839839

840+
def visit_GenerateIfElse(self, node):
841+
return None
842+
840843

841844
#-------------------------------------------------------------------------
842845
class VerilogBindVisitor(VerilogCommonVisitor):

0 commit comments

Comments
 (0)