Skip to content

Commit 9606de3

Browse files
committed
The functions of copy_ports and connect_ports are improved. width_visitor.py is added.
1 parent 045fe84 commit 9606de3

File tree

1 file changed

+64
-0
lines changed

1 file changed

+64
-0
lines changed

veriloggen/core/width_visitor.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
4+
import os
5+
import sys
6+
import copy
7+
8+
import veriloggen.core.vtypes as vtypes
9+
10+
class WidthVisitor(object):
11+
def __init__(self, prefix=None, postfix=None):
12+
self.prefix = prefix if prefix is not None else ''
13+
self.postfix = postfix if postfix is not None else ''
14+
15+
def generic_visit(self, node):
16+
raise TypeError("Type %s is not supported." % str(type(node)))
17+
18+
def visit(self, node):
19+
if node is None: return None
20+
if isinstance(node, vtypes._Variable):
21+
return self.visit__Variable(node)
22+
if isinstance(node, vtypes._BinaryOperator):
23+
return self.visit__BinaryOperator(node)
24+
if isinstance(node, vtypes._UnaryOperator):
25+
return self.visit__UnaryOperator(node)
26+
27+
visitor = getattr(self, 'visit_' + node.__class__.__name__, self.generic_visit)
28+
return visitor(node)
29+
30+
def visit__Variable(self, node):
31+
ret = copy.deepcopy(node)
32+
ret.name = ''.join([self.prefix, ret.name, self.postfix])
33+
return ret
34+
35+
def visit_Pointer(self, node):
36+
var = self.visit(node.var)
37+
pos = self.visit(node.pos)
38+
return vtypes.Pointer(var, pos)
39+
40+
def visit_Slice(self, node):
41+
var = self.visit(node.var)
42+
msb = self.visit(node.msb)
43+
lsb = self.visit(node.lsb)
44+
return vtypes.Slice(var, msb, lsb)
45+
46+
def visit_Cat(self, node):
47+
vars = [ self.visit(var) for var in node.vars ]
48+
return vtypes.Cat(*vars)
49+
50+
def visit_Repeat(self, node):
51+
var = self.visit(node.var)
52+
times = self.visit(node.times)
53+
return vtypes.Repeat(var, times)
54+
55+
def visit__BinaryOperator(self, node):
56+
op = type(node)
57+
left = self.visit(node)
58+
right = self.visit(right)
59+
return op(left, right)
60+
61+
def visit__UnaryOperator(self, node):
62+
op = type(node)
63+
right = self.visit(right)
64+
return op(right)

0 commit comments

Comments
 (0)