mirror of
https://github.com/myhdl/myhdl.git
synced 2025-01-24 21:52:56 +08:00
new checks for Signal
This commit is contained in:
parent
bc1947feb2
commit
3d9c664904
@ -67,7 +67,7 @@ class Signal(object):
|
|||||||
|
|
||||||
__slots__ = ('_next', '_val', '_min', '_max', '_type',
|
__slots__ = ('_next', '_val', '_min', '_max', '_type',
|
||||||
'_eventWaiters', '_posedgeWaiters', '_negedgeWaiters',
|
'_eventWaiters', '_posedgeWaiters', '_negedgeWaiters',
|
||||||
'_code', '_tracing', '_nrbits', '_hasBounds',
|
'_code', '_tracing', '_nrbits', '_checkVal',
|
||||||
'_printVcd'
|
'_printVcd'
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -89,27 +89,24 @@ class Signal(object):
|
|||||||
self._type = (int, long, intbv)
|
self._type = (int, long, intbv)
|
||||||
self._printVcd = self._printVcdStr
|
self._printVcd = self._printVcdStr
|
||||||
if type(val) is bool:
|
if type(val) is bool:
|
||||||
self._min = 0
|
self._checkVal = self._checkBool
|
||||||
self._max = 1
|
|
||||||
self._nrbits = 1
|
self._nrbits = 1
|
||||||
elif isinstance(val, (int, long)):
|
elif isinstance(val, (int, long)):
|
||||||
|
self._checkVal = self._checkInt
|
||||||
self._printVcd = self._printVcdHex
|
self._printVcd = self._printVcdHex
|
||||||
elif isinstance(val, intbv):
|
elif isinstance(val, intbv):
|
||||||
self._printVcd = self._printVcdHex
|
|
||||||
self._min = val._min
|
self._min = val._min
|
||||||
self._max = val._max
|
self._max = val._max
|
||||||
if val._len:
|
self._nrbits = val._nrbits
|
||||||
self._nrbits = val._len
|
if self._nrbits:
|
||||||
elif val._min is not None and val._max is not None:
|
self._checkVal = self._checkIntbvBounds
|
||||||
self._nrbits = max(len(bin(val._min)), len(bin(val._max-1)))
|
self._printVcd = self._printVcdVec
|
||||||
|
else:
|
||||||
|
self._checkVal = self._checkInt
|
||||||
|
self._printVcd = self._printVcdHex
|
||||||
else:
|
else:
|
||||||
self._type = type(val)
|
self._type = type(val)
|
||||||
if self._nrbits:
|
self._checkVal = self._checkType
|
||||||
if self._nrbits == 1:
|
|
||||||
self._printVcd = self._printVcdBit
|
|
||||||
else:
|
|
||||||
self._printVcd = self._printVcdVec
|
|
||||||
self._hasBounds = (self._min is not None) or (self._max is not None)
|
|
||||||
self._eventWaiters = _WaiterList()
|
self._eventWaiters = _WaiterList()
|
||||||
self._posedgeWaiters = _WaiterList()
|
self._posedgeWaiters = _WaiterList()
|
||||||
self._negedgeWaiters = _WaiterList()
|
self._negedgeWaiters = _WaiterList()
|
||||||
@ -147,10 +144,11 @@ class Signal(object):
|
|||||||
def _set_next(self, val):
|
def _set_next(self, val):
|
||||||
if isinstance(val, Signal):
|
if isinstance(val, Signal):
|
||||||
val = val._val
|
val = val._val
|
||||||
|
self._checkVal(val)
|
||||||
# print self._type
|
# print self._type
|
||||||
if not isinstance(val, self._type):
|
## if not isinstance(val, self._type):
|
||||||
raise TypeError, "Incompatible type(v) for sig.next = v\n" \
|
## raise TypeError, "Incompatible type(v) for sig.next = v\n" \
|
||||||
" Expected %s, got %s" % (self._type, type(val))
|
## " Expected %s, got %s" % (self._type, type(val))
|
||||||
self._next = val
|
self._next = val
|
||||||
_siglist.append(self)
|
_siglist.append(self)
|
||||||
next = property(_get_next, _set_next, None, "'next' access methods")
|
next = property(_get_next, _set_next, None, "'next' access methods")
|
||||||
@ -165,6 +163,28 @@ class Signal(object):
|
|||||||
return self._negedgeWaiters
|
return self._negedgeWaiters
|
||||||
negedge = property(_get_negedge, None, None, "'posedge' access methodes")
|
negedge = property(_get_negedge, None, None, "'posedge' access methodes")
|
||||||
|
|
||||||
|
# check methods
|
||||||
|
def _checkBool(self, val):
|
||||||
|
if not val in (0, 1):
|
||||||
|
raise ValueError("Expected value 0 or 1, got %s" % val)
|
||||||
|
|
||||||
|
def _checkInt(self, val):
|
||||||
|
if not isinstance(val, (int, long, intbv)):
|
||||||
|
raise TypeError("Expected int or intbv, got %s" % type(val))
|
||||||
|
|
||||||
|
def _checkIntbvBounds(self, val):
|
||||||
|
if not isinstance(val, (int, long, intbv)):
|
||||||
|
raise TypeError("Expected int or intbv, got %s" % type(val))
|
||||||
|
if self._max is not None and val >= self._max:
|
||||||
|
raise ValueError("Expected value < %s, got %s" % self._max, val)
|
||||||
|
if self._min is not None and val < self._min:
|
||||||
|
raise ValueError("Expected value >= %s, got %s" % self._min, val)
|
||||||
|
|
||||||
|
def _checkType(self, val):
|
||||||
|
if not isinstance(val, self._type):
|
||||||
|
raise TypeError("Expected %s, got %s" % (self._type, type(val)))
|
||||||
|
|
||||||
|
# vcd print methods
|
||||||
def _printVcdStr(self):
|
def _printVcdStr(self):
|
||||||
print >> sim._tf, "s%s %s" % (str(self._val), self._code)
|
print >> sim._tf, "s%s %s" % (str(self._val), self._code)
|
||||||
|
|
||||||
|
@ -49,9 +49,7 @@ class intbv(object):
|
|||||||
nrbits = len(bin(min))
|
nrbits = len(bin(min))
|
||||||
self._max = max
|
self._max = max
|
||||||
if max is not None:
|
if max is not None:
|
||||||
n = len(bin(max))
|
nrbits = maxfunc(len(bin(max-1)), nrbits)
|
||||||
if n > nrbits:
|
|
||||||
nrbits = n
|
|
||||||
self._nrbits = nrbits
|
self._nrbits = nrbits
|
||||||
if isinstance(val, (int, long)):
|
if isinstance(val, (int, long)):
|
||||||
self._val = val
|
self._val = val
|
||||||
|
Loading…
x
Reference in New Issue
Block a user