Skip to content

Commit cd3001c

Browse files
committed
__getattr__ methods of module and dataflow are updated.
1 parent 3b5d94e commit cd3001c

File tree

2 files changed

+40
-10
lines changed

2 files changed

+40
-10
lines changed

veriloggen/core/module.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,28 @@ def get_ports(self):
392392

393393
def get_vars(self):
394394
return self.variable
395-
395+
396+
def __getitem__(self, r):
397+
if isinstance(r, slice):
398+
raise TypeError("Index must be str.")
399+
if not isinstance(r, str):
400+
raise TypeError("Index must be str.")
401+
402+
v = self.find_identifier(r)
403+
if v is None:
404+
raise NameError("No such variable '%s'" % r)
405+
return v
406+
407+
def __getattr__(self, attr):
408+
try:
409+
return vtypes.VeriloggenNode.__getattr__(self, attr)
410+
except AttributeError as e:
411+
if 'io_variable' in dir(self):
412+
v = self.find_identifier(attr)
413+
if v is not None:
414+
return v
415+
raise e
416+
396417
#---------------------------------------------------------------------------
397418
def copy_params(self, src, prefix=None, postfix=None, exclude=None):
398419
if prefix is None: prefix = ''

veriloggen/dataflow/dataflow.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import sys
55
import copy
66
import collections
7+
import functools
78

89
import veriloggen.core.vtypes as vtypes
910
from veriloggen.core.module import Module
@@ -204,14 +205,22 @@ def pipeline_depth(self):
204205

205206
#-------------------------------------------------------------------------
206207
def __getattr__(self, attr):
207-
func = getattr(dtypes, attr)
208+
try:
209+
return object.__getattr__(self, attr)
208210

209-
def wrapper(*args, **kwargs):
210-
v = func(*args, **kwargs)
211-
if isinstance(v, dtypes._Numeric):
212-
v._set_module(self.module)
213-
v._set_df(self)
214-
v._set_seq(self.seq)
215-
return v
211+
except AttributeError as e:
212+
if attr.startswith('__') or attr not in dir(dtypes):
213+
raise e
216214

217-
return wrapper
215+
func = getattr(dtypes, attr)
216+
217+
@functools.wraps(func)
218+
def wrapper(*args, **kwargs):
219+
v = func(*args, **kwargs)
220+
if isinstance(v, dtypes._Numeric):
221+
v._set_module(self.module)
222+
v._set_df(self)
223+
v._set_seq(self.seq)
224+
return v
225+
226+
return wrapper

0 commit comments

Comments
 (0)