host: split read/export and add csv export
This commit is contained in:
parent
8719206a3a
commit
a737358919
|
@ -1,7 +1,7 @@
|
||||||
import csv
|
import csv
|
||||||
import time
|
import time
|
||||||
import sys
|
import sys
|
||||||
from miscope.host.vcd import *
|
from miscope.host.export import *
|
||||||
from miscope.host.truthtable import *
|
from miscope.host.truthtable import *
|
||||||
|
|
||||||
class MiIoDriver():
|
class MiIoDriver():
|
||||||
|
@ -23,20 +23,19 @@ class MiIoDriver():
|
||||||
return self.miio_i.read()
|
return self.miio_i.read()
|
||||||
|
|
||||||
class MiLaDriver():
|
class MiLaDriver():
|
||||||
def __init__(self, regs, name, csv_name=None, use_rle=True):
|
def __init__(self, regs, name, config_csv=None, use_rle=True):
|
||||||
self.regs = regs
|
self.regs = regs
|
||||||
self.name = name
|
self.name = name
|
||||||
self.use_rle = use_rle
|
self.use_rle = use_rle
|
||||||
|
if config_csv is None:
|
||||||
if csv_name is None:
|
self.config_csv = name + ".csv"
|
||||||
self.csv = name + ".csv"
|
|
||||||
self.get_config()
|
self.get_config()
|
||||||
self.get_layout()
|
self.get_layout()
|
||||||
self.build_mila()
|
self.build_mila()
|
||||||
self.dat = VcdDat(self.width)
|
self.dat = Dat(self.width)
|
||||||
|
|
||||||
def get_config(self):
|
def get_config(self):
|
||||||
csv_reader = csv.reader(open(self.csv), delimiter=',', quotechar='#')
|
csv_reader = csv.reader(open(self.config_csv), delimiter=',', quotechar='#')
|
||||||
for item in csv_reader:
|
for item in csv_reader:
|
||||||
t, n, v = item
|
t, n, v = item
|
||||||
if t == "config":
|
if t == "config":
|
||||||
|
@ -44,7 +43,7 @@ class MiLaDriver():
|
||||||
|
|
||||||
def get_layout(self):
|
def get_layout(self):
|
||||||
self.layout = []
|
self.layout = []
|
||||||
csv_reader = csv.reader(open(self.csv), delimiter=',', quotechar='#')
|
csv_reader = csv.reader(open(self.config_csv), delimiter=',', quotechar='#')
|
||||||
for item in csv_reader:
|
for item in csv_reader:
|
||||||
t, n, v = item
|
t, n, v = item
|
||||||
if t == "layout":
|
if t == "layout":
|
||||||
|
@ -64,10 +63,8 @@ class MiLaDriver():
|
||||||
setattr(self, name+"_m", (2**length-1) << value)
|
setattr(self, name+"_m", (2**length-1) << value)
|
||||||
value += length
|
value += length
|
||||||
|
|
||||||
def show_state(self, s, last=False):
|
def show_state(self, s):
|
||||||
print(s, end="")
|
print(s, end="|")
|
||||||
if not last:
|
|
||||||
print("-->", end="")
|
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
|
|
||||||
def prog_term(self, port, trigger, mask):
|
def prog_term(self, port, trigger, mask):
|
||||||
|
@ -116,8 +113,8 @@ class MiLaDriver():
|
||||||
self.mila_recorder_length.write(length)
|
self.mila_recorder_length.write(length)
|
||||||
self.mila_recorder_trigger.write(1)
|
self.mila_recorder_trigger.write(1)
|
||||||
|
|
||||||
def read(self, vcd=None):
|
def read(self):
|
||||||
self.show_state("READ", last=not vcd)
|
self.show_state("READ")
|
||||||
empty = self.mila_recorder_read_empty.read()
|
empty = self.mila_recorder_read_empty.read()
|
||||||
while(not empty):
|
while(not empty):
|
||||||
self.dat.append(self.mila_recorder_read_dat.read())
|
self.dat.append(self.mila_recorder_read_dat.read())
|
||||||
|
@ -125,8 +122,17 @@ class MiLaDriver():
|
||||||
self.mila_recorder_read_en.write(1)
|
self.mila_recorder_read_en.write(1)
|
||||||
if self.use_rle:
|
if self.use_rle:
|
||||||
self.dat = self.dat.decode_rle()
|
self.dat = self.dat.decode_rle()
|
||||||
if vcd:
|
return self.dat
|
||||||
self.show_state("OUTPUT", last=True)
|
|
||||||
_vcd = Vcd()
|
def export(self, export_fn=None):
|
||||||
_vcd.add_from_layout(self.layout, self.dat)
|
self.show_state("EXPORT")
|
||||||
_vcd.write(vcd)
|
if ".vcd" in export_fn:
|
||||||
|
vcd = VCD()
|
||||||
|
vcd.add_from_layout(self.layout, self.dat)
|
||||||
|
vcd.write(export_fn)
|
||||||
|
elif ".csv" in export_fn:
|
||||||
|
csv = CSV()
|
||||||
|
csv.add_from_layout(self.layout, self.dat)
|
||||||
|
csv.write(export_fn)
|
||||||
|
else:
|
||||||
|
raise NotImplementedError
|
||||||
|
|
|
@ -26,7 +26,7 @@ def get_bits(values, width, low, high=None):
|
||||||
r.append(t)
|
r.append(t)
|
||||||
return r
|
return r
|
||||||
|
|
||||||
class VcdDat(list):
|
class Dat(list):
|
||||||
def __init__(self, width):
|
def __init__(self, width):
|
||||||
self.width = width
|
self.width = width
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ class VcdDat(list):
|
||||||
rle_bit = self[-1]
|
rle_bit = self[-1]
|
||||||
rle_dat = self[:self.width-1]
|
rle_dat = self[:self.width-1]
|
||||||
|
|
||||||
dat = VcdDat(self.width)
|
dat = Dat(self.width)
|
||||||
i=0
|
i=0
|
||||||
last = 0
|
last = 0
|
||||||
for d in self:
|
for d in self:
|
||||||
|
@ -98,7 +98,7 @@ class Var:
|
||||||
return r
|
return r
|
||||||
return r
|
return r
|
||||||
|
|
||||||
class Vcd:
|
class VCD:
|
||||||
def __init__(self, timescale="1ps", comment=""):
|
def __init__(self, timescale="1ps", comment=""):
|
||||||
self.timescale = timescale
|
self.timescale = timescale
|
||||||
self.comment = comment
|
self.comment = comment
|
||||||
|
@ -229,8 +229,67 @@ class Vcd:
|
||||||
f.write(str(self))
|
f.write(str(self))
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
|
class CSV:
|
||||||
|
def __init__(self):
|
||||||
|
self.vars = []
|
||||||
|
self.cnt = -1
|
||||||
|
|
||||||
|
def add(self, var):
|
||||||
|
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
|
||||||
|
|
||||||
|
def p_vars(self):
|
||||||
|
r = ""
|
||||||
|
for var in self.vars:
|
||||||
|
r += var.name
|
||||||
|
r += ","
|
||||||
|
r += "\n"
|
||||||
|
for var in self.vars:
|
||||||
|
r += str(var.width)
|
||||||
|
r += ","
|
||||||
|
r += "\n"
|
||||||
|
return r
|
||||||
|
|
||||||
|
def p_dumpvars(self):
|
||||||
|
r = ""
|
||||||
|
for i in range(len(self)):
|
||||||
|
for var in self.vars:
|
||||||
|
try:
|
||||||
|
var.val = var.values[i]
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
if var.val == "x":
|
||||||
|
r += "x"
|
||||||
|
else:
|
||||||
|
r += dec2bin(var.val, var.width)
|
||||||
|
r += ", "
|
||||||
|
r+= "\n"
|
||||||
|
return r
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
r = ""
|
||||||
|
r += self.p_vars()
|
||||||
|
r += self.p_dumpvars()
|
||||||
|
return r
|
||||||
|
|
||||||
|
def write(self, filename):
|
||||||
|
f = open(filename, "w")
|
||||||
|
f.write(str(self))
|
||||||
|
f.close()
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
myvcd = Vcd()
|
myvcd = VCD()
|
||||||
myvcd.add(Var("foo1", 1, [0,1,0,1,0,1]))
|
myvcd.add(Var("foo1", 1, [0,1,0,1,0,1]))
|
||||||
myvcd.add(Var("foo2", 2, [1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0]))
|
myvcd.add(Var("foo2", 2, [1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0]))
|
||||||
myvcd.add(Var("foo3", 3))
|
myvcd.add(Var("foo3", 3))
|
||||||
|
@ -239,6 +298,16 @@ def main():
|
||||||
myvcd.add(Var("ramp", 16, ramp))
|
myvcd.add(Var("ramp", 16, ramp))
|
||||||
print(myvcd)
|
print(myvcd)
|
||||||
|
|
||||||
|
mycsv = CSV()
|
||||||
|
mycsv.add(Var("foo1", 1, [0,1,0,1,0,1]))
|
||||||
|
mycsv.add(Var("foo2", 2, [1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0]))
|
||||||
|
mycsv.add(Var("foo3", 3))
|
||||||
|
mycsv.add(Var("foo4", 4))
|
||||||
|
ramp = [i%128 for i in range(1024)]
|
||||||
|
mycsv.add(Var("ramp", 16, ramp))
|
||||||
|
print(mycsv)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
main()
|
main()
|
||||||
|
|
Loading…
Reference in New Issue