114 lines
2.6 KiB
Python
114 lines
2.6 KiB
Python
def dec2bin(d, nb=0):
|
|
if d == "x":
|
|
return "x"*nb
|
|
elif d == 0:
|
|
b = "0"
|
|
else:
|
|
b = ""
|
|
while d != 0:
|
|
b = "01"[d&1] + b
|
|
d = d >> 1
|
|
return b.zfill(nb)
|
|
|
|
|
|
def get_bits(values, low, high=None):
|
|
r = []
|
|
if high is None:
|
|
high = low+1
|
|
for val in values:
|
|
t = (val >> low) & (2**(high-low)-1)
|
|
r.append(t)
|
|
return r
|
|
|
|
|
|
class Dat(list):
|
|
def __init__(self, width):
|
|
self.width = width
|
|
|
|
def __getitem__(self, key):
|
|
if isinstance(key, int):
|
|
return get_bits(self, key)
|
|
elif isinstance(key, slice):
|
|
if key.start != None:
|
|
start = key.start
|
|
else:
|
|
start = 0
|
|
if key.stop != None:
|
|
stop = key.stop
|
|
else:
|
|
stop = self.width
|
|
if stop > self.width:
|
|
stop = self.width
|
|
if key.step != None:
|
|
raise KeyError
|
|
return get_bits(self, start, stop)
|
|
else:
|
|
raise KeyError
|
|
|
|
def decode_rle(self):
|
|
datas = Dat(self.width-1)
|
|
last_data = 0
|
|
for data in self:
|
|
rle = data >> (self.width-1)
|
|
data = data & (2**(self.width-1)-1)
|
|
if rle:
|
|
for i in range(data):
|
|
datas.append(last_data)
|
|
else:
|
|
datas.append(data)
|
|
last_data = data
|
|
return datas
|
|
|
|
|
|
class Var:
|
|
def __init__(self, name, width, values=[], type="wire", default="x"):
|
|
self.type = type
|
|
self.width = width
|
|
self.name = name
|
|
self.val = default
|
|
self.values = values
|
|
self.vcd_id = None
|
|
|
|
def set_vcd_id(self, s):
|
|
self.vcd_id = s
|
|
|
|
def __len__(self):
|
|
return len(self.values)
|
|
|
|
def change(self, cnt):
|
|
r = ""
|
|
try:
|
|
if self.values[cnt+1] != self.val:
|
|
r += "b"
|
|
r += dec2bin(self.values[cnt+1], self.width)
|
|
r += " "
|
|
r += self.vcd_id
|
|
r += "\n"
|
|
return r
|
|
except:
|
|
return r
|
|
return r
|
|
|
|
|
|
class Dump:
|
|
def __init__(self):
|
|
self.vars = []
|
|
self.vcd_id = "!"
|
|
|
|
def add(self, var):
|
|
var.set_vcd_id(self.vcd_id)
|
|
self.vcd_id = chr(ord(self.vcd_id)+1)
|
|
self.vars.append(var)
|
|
|
|
def add_from_layout(self, layout, var):
|
|
i = 0
|
|
for s, n in layout:
|
|
self.add(Var(s, n, var[i:i+n]))
|
|
i += n
|
|
|
|
def __len__(self):
|
|
l = 0
|
|
for var in self.vars:
|
|
l = max(len(var), l)
|
|
return l
|