Skip to content

Commit 323d3a8

Browse files
authored
Merge pull request #12 from fsagbuya/bitwise-refactor
Refactor bit manipulation and remove `myhdl` dependency
2 parents bfc25bd + 53c8c64 commit 323d3a8

File tree

2 files changed

+30
-17
lines changed

2 files changed

+30
-17
lines changed

pyproject.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ readme = "README.md"
2020
requires-python = ">=3.10"
2121
dependencies = [
2222
"cached_property>=1.5.2,<2.0",
23-
"myhdl>=0.11",
2423
"numpy>=1.21.5,<2.0",
2524
"rpyc>=6.0.0,<7.0",
2625
]

pyrp3/instrument.py

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from math import ceil, log
22

33
import numpy as np
4-
from myhdl import intbv
54

65
from .enum import Enum
76
from .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

2124
class 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

3448
class 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

90103
class 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

Comments
 (0)