11from math import ceil , log
22
33import numpy as np
4- from myhdl import intbv
54
65from .enum import Enum
76from .memory import MemoryInterface
@@ -12,23 +11,38 @@ def __init__(self, size):
1211 self .size = size
1312
1413 def to_python (self , val ):
15- return int (val & (2 ** self .size - 1 ))
14+ if not 0 <= val < (1 << self .size ):
15+ raise ValueError ("Input value %s exceeds %s-bit limit" % (val , self .size ))
16+ return int (val & ((1 << self .size ) - 1 ))
1617
1718 def to_binary (self , val ):
18- return intbv (val , max = 2 ** self .size , min = 0 )._val
19+ if not 0 <= val < (1 << self .size ):
20+ raise ValueError ("Input value %s exceeds %s-bit limit" % (val , self .size ))
21+ return val & ((1 << self .size ) - 1 )
1922
2023
2124class SignedInteger :
2225 def __init__ (self , size ):
2326 self .size = size
2427
2528 def to_python (self , val ):
26- return int (intbv (val & (2 ** self .size - 1 ), min = 0 , max = 2 ** self .size ).signed ())
29+ val &= (1 << self .size ) - 1
30+ if val >= (1 << (self .size - 1 )):
31+ val -= 1 << self .size
32+ if not - (1 << (self .size - 1 )) <= val < (1 << (self .size - 1 )):
33+ raise ValueError (
34+ "Input value %s exceeds %s-bit signed limit" % (val , self .size )
35+ )
36+ return int (val )
2737
2838 def to_binary (self , val ):
29- return intbv (val , min = - (2 ** (self .size - 1 )), max = 2 ** (self .size - 1 ))[
30- self .size :
31- ]._val
39+ if not - (1 << (self .size - 1 )) <= val < (1 << self .size ):
40+ raise ValueError (
41+ "Input value %s exceeds %s-bit signed limit" % (val , self .size )
42+ )
43+ if val < 0 :
44+ val += 1 << self .size
45+ return val & ((1 << self .size ) - 1 )
3246
3347
3448class EnumTypeWrapper (UnsignedInteger ):
@@ -80,11 +94,10 @@ def to_binary(self, val):
8094 val = val / 1.8
8195 assert val >= 0
8296 assert val <= 1
83- out = intbv (0 , min = 0 , max = 2 ** 32 )
84- tmp = np .long (np .round (val * (17 * 157 - 1 )))
85- out [32 :16 ] = tmp // 17
86- out [16 :0 ] = 2 ** tmp % 17 - 1
87- return out [32 :]._val
97+ tmp = np .longlong (np .round (val * (17 * 157 - 1 )))
98+ high = tmp // 17
99+ low = (1 << (tmp % 17 )) - 1
100+ return (high << 16 ) | low
88101
89102
90103class RegisterProperty :
@@ -128,13 +141,14 @@ def __get__(self, instance, owner):
128141 if instance is None :
129142 return self
130143 out = instance .read (self .addr )
131- val = intbv (out )[self .pos ]
132- return val if self ._bit_type is None else self ._bit_type .to_python (val )
144+ val = (out >> self .pos ) & 1
145+ return (
146+ bool (val ) if self ._bit_type is None else self ._bit_type .to_python (bool (val ))
147+ )
133148
134149 def __set__ (self , instance , value ):
135150 current = instance .read (self .addr )
136- new_value = intbv (current )
137- new_value [self .pos ] = value
151+ new_value = current & ~ (1 << self .pos ) | ((value & 1 ) << self .pos )
138152 return instance .write (self .addr , int (new_value ))
139153
140154
0 commit comments