188 lines
3.2 KiB
Python
188 lines
3.2 KiB
Python
import sys
|
|
import datetime
|
|
|
|
from miscope.tools.conv import *
|
|
|
|
def get_bits(values, width, low, high =None):
|
|
r = []
|
|
for val in values:
|
|
t = dec2bin(val,width)[::-1]
|
|
if high == None:
|
|
t = t[low]
|
|
else:
|
|
t = t[low:high]
|
|
t = t[::1]
|
|
t = int(t,2)
|
|
r.append(t)
|
|
return r
|
|
|
|
class Var:
|
|
def __init__(self,type , width , name, values=[], 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 Vcd:
|
|
def __init__(self,timescale = "1ps", comment = ""):
|
|
self.timescale = timescale
|
|
self.comment = comment
|
|
self.vars = []
|
|
self.vcd_id = "!"
|
|
self.cnt = -1
|
|
|
|
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 __len__(self):
|
|
l = 0
|
|
for var in self.vars:
|
|
l = max(len(var),l)
|
|
return l
|
|
|
|
def change(self):
|
|
r = ""
|
|
c = ""
|
|
for var in self.vars:
|
|
c += var.change(self.cnt)
|
|
if c != "":
|
|
r += "#"
|
|
r += str(self.cnt+1)
|
|
r += "\n"
|
|
r += c
|
|
return r
|
|
|
|
|
|
def p_date(self):
|
|
now = datetime.datetime.now()
|
|
r = "$date\n"
|
|
r += "\t"
|
|
r += now.strftime("%Y-%m-%d %H:%M")
|
|
r += "\n"
|
|
r += "$end\n"
|
|
return r
|
|
|
|
def p_version(self):
|
|
r = "$version\n"
|
|
r += "\tmiscope VCD dump\n"
|
|
r += "$end\n"
|
|
return r
|
|
|
|
def p_comment(self):
|
|
r = "$comment\n"
|
|
r += self.comment
|
|
r += "\n$end\n"
|
|
return r
|
|
|
|
def p_timescale(self):
|
|
r = "$timescale "
|
|
r += self.timescale
|
|
r += " $end\n"
|
|
return r
|
|
|
|
def p_scope(self):
|
|
r = "$scope "
|
|
r += self.timescale
|
|
r += " $end\n"
|
|
return r
|
|
def p_vars(self):
|
|
r = ""
|
|
for var in self.vars:
|
|
r += "$var "
|
|
r += var.type
|
|
r += " "
|
|
r += str(var.width)
|
|
r += " "
|
|
r += var.vcd_id
|
|
r += " "
|
|
r += var.name
|
|
r += " $end\n"
|
|
return r
|
|
|
|
def p_unscope(self):
|
|
r = "$unscope "
|
|
r += " $end\n"
|
|
return r
|
|
|
|
def p_enddefinitions(self):
|
|
r = "$enddefinitions "
|
|
r += " $end\n"
|
|
return r
|
|
|
|
def p_dumpvars(self):
|
|
r = "$dumpvars\n"
|
|
for var in self.vars:
|
|
r += "b"
|
|
r += dec2bin(var.val, var.width)
|
|
r += " "
|
|
r += var.vcd_id
|
|
r+= "\n"
|
|
r += "$end\n"
|
|
return r
|
|
|
|
def p_valuechange(self):
|
|
r = ""
|
|
for i in range(len(self)):
|
|
r += self.change()
|
|
self.cnt += 1
|
|
return r
|
|
|
|
|
|
def __repr__(self):
|
|
r = ""
|
|
r += self.p_date()
|
|
r += self.p_version()
|
|
r += self.p_comment()
|
|
r += self.p_timescale()
|
|
r += self.p_scope()
|
|
r += self.p_vars()
|
|
r += self.p_unscope()
|
|
r += self.p_enddefinitions()
|
|
r += self.p_dumpvars()
|
|
r += self.p_valuechange()
|
|
return r
|
|
|
|
def write(self, filename):
|
|
f = open(filename, "w")
|
|
f.write(str(self))
|
|
f.close()
|
|
|
|
def main():
|
|
myvcd = Vcd()
|
|
myvcd.add(Var("wire", 1, "foo1", [0,1,0,1,0,1]))
|
|
myvcd.add(Var("wire", 2, "foo2", [1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0]))
|
|
myvcd.add(Var("wire", 3, "foo3"))
|
|
myvcd.add(Var("wire", 4, "foo4"))
|
|
ramp = [i%128 for i in range(1024)]
|
|
myvcd.add(Var("wire", 16, "ramp", ramp))
|
|
print(myvcd)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|
|
|