310 lines
11 KiB
Python
310 lines
11 KiB
Python
#!/bin/python3
|
|
|
|
# problems:
|
|
# some parse error causes it to ignore filters AND not let you add them (can be caused from gui); changing order
|
|
# of traces fixes it - maybe problem with my trans filter?
|
|
|
|
import sys
|
|
import os
|
|
import io
|
|
from dotmap import DotMap
|
|
|
|
from vcd.gtkw import *
|
|
|
|
gtkwFile = 'pyvcd.gtkw'
|
|
#fo = io.StringIO(gtkwFile)
|
|
fo = open(gtkwFile, 'w')
|
|
gtkw = GTKWSave(fo)
|
|
|
|
base = 'cocotb_icarus.'
|
|
topIndicator = '!' #wtf never need this?
|
|
vectorNoBits = False
|
|
core = 0
|
|
|
|
# add zero and one signals to top level for use here
|
|
zero = 'an_ac_sg_8'
|
|
|
|
filterPath = '../gtkwave/'
|
|
filterNull = filterPath + 'gtkf-nop.py'
|
|
filterValid = filterPath + 'gtkf-valid.py'
|
|
filterIBuf = filterPath + 'gtkf-ibuf.py'
|
|
filterPPC = filterPath + 'gtkf-ppc.py'
|
|
filterA2L2 = filterPath + 'gtkf-a2l2.py'
|
|
filterR64 = filterPath + 'gtkf-64R.py'
|
|
|
|
# need to indicate if signal is 'threaded' (vector) to gen diff netlists for diff smt modes
|
|
|
|
|
|
# showVector should maybe be done by Combined that can take specific bits to use
|
|
class Signal(DotMap):
|
|
def __init__(self, name, alias=None, color=None, highlight=False, rjustify=False, datafmt='bin', extraflags=GTKWFlag(0), translateFile=None, translateProc=None, transactionProc=None, bits=None, showVector=False):
|
|
super().__init__()
|
|
if name[0] != topIndicator:
|
|
name = base + name
|
|
else:
|
|
name = name[1:]
|
|
self.name = name
|
|
self.bits = bits
|
|
self.alias = alias
|
|
self.color = color
|
|
self.highlight = highlight
|
|
self.rjustify = rjustify
|
|
self.datafmt = datafmt
|
|
self.extraflags = extraflags
|
|
self.translateFile = translateFile
|
|
self.translateProc = translateProc
|
|
self.transactionProc = transactionProc
|
|
self.showVector = showVector
|
|
|
|
def add(self):
|
|
trace = self.name
|
|
bits = self.bits
|
|
if bits is not None:
|
|
if vectorNoBits:
|
|
trace = trace.split('[')[0]
|
|
if type(bits) is not list:
|
|
bits = [bits]
|
|
with gtkw.trace_bits(trace, showVector=self.showVector):
|
|
for i in range(len(bits)):
|
|
# for now - i guess highlight and filters might make sense
|
|
#gtkw.trace_bit(bits[i], trace, self.alias, self.color, self.datafmt, self.highlight, self.rjustify, self.extraflags, translate_filter_file=self.translateFile, translate_filter_proc=self.translateProc, transaction_filter_proc=self.transactionProc)
|
|
gtkw.trace_bit(bits[i], trace, self.alias, self.color)
|
|
|
|
else:
|
|
gtkw.trace(trace, self.alias, self.color, self.datafmt, self.highlight, self.rjustify, self.extraflags, translate_filter_file=self.translateFile, translate_filter_proc=self.translateProc, transaction_filter_proc=self.transactionProc)
|
|
|
|
class Combined(DotMap):
|
|
def __init__(self, name, traces, color=None, highlight=False, rjustify=False, datafmt='bin', extraflags=GTKWFlag(0), translateFile=None, translateProc=None, transactionProc=None):
|
|
super().__init__()
|
|
self.name = name
|
|
self.traces = traces
|
|
self.color = color
|
|
self.highlight = highlight
|
|
self.rjustify = rjustify
|
|
self.datafmt = datafmt
|
|
self.extraflags = extraflags
|
|
self.translateFile = translateFile
|
|
self.translateProc = translateProc
|
|
self.transactionProc = transactionProc
|
|
|
|
def add(self):
|
|
trace = []
|
|
for t in self.traces:
|
|
trace.append(t.name)
|
|
gtkw.trace(trace, self.name, self.color, self.datafmt, self.highlight, self.rjustify, self.extraflags, translate_filter_file=self.translateFile, translate_filter_proc=self.translateProc, transaction_filter_proc=self.transactionProc)
|
|
|
|
class Group(DotMap):
|
|
def __init__(self, name, traces, closed=True, highlight=False):
|
|
super().__init__()
|
|
self.name = name
|
|
self.traces = traces
|
|
self.closed = closed
|
|
self.highlight = highlight
|
|
|
|
def add(self):
|
|
if len(self.traces) > 0:
|
|
with gtkw.group(self.name, self.closed, self.highlight):
|
|
for j in range(len(self.traces)):
|
|
self.traces[j].add()
|
|
|
|
def addCombined(self, alias, color=None, highlight=False, rjustify=False, datafmt='bin', extraflags=GTKWFlag(0), translateFile=None, translateProc=None, transactionProc=None):
|
|
trace = []
|
|
for t in self.traces:
|
|
trace.append(t.name)
|
|
gtkw.trace(trace, alias, color, datafmt, highlight, rjustify, extraflags, translate_filter_file=translateFile, translate_filter_proc=translateProc, transaction_filter_proc=transactionProc)
|
|
|
|
nodeMisc = Group('Misc', [
|
|
Signal(f'nclk[0:5]', alias='reset', bits=1, showVector=False),
|
|
Signal(f'nclk[0:5]', alias='clk1x', bits=0, showVector=False),
|
|
Signal(f'nclk[0:5]', alias='clk2x', bits=2, showVector=False),
|
|
Signal(f'an_ac_pm_thread_stop[0]')
|
|
#Signal('ac_an_checkstop[0:2]'),
|
|
])
|
|
#nodeMisc.add()
|
|
# until gtkwave has a tiny nested indicator...
|
|
for i in range(len(nodeMisc.traces)):
|
|
nodeMisc.traces[i].add()
|
|
|
|
a2l2Req = Group('A2L2 Req', [
|
|
Signal(f'ac_an_req'),
|
|
Signal(f'ac_an_req_endian'),
|
|
Signal(f'ac_an_req_ld_core_tag[0:4]'),
|
|
Signal(f'ac_an_req_ld_xfr_len[0:2]'),
|
|
Signal(f'ac_an_req_pwr_token'),
|
|
Signal(f'ac_an_req_ra[22:63]'),
|
|
Signal(f'ac_an_req_ttype[0:5]'),
|
|
Signal(f'ac_an_req_wimg_w'),
|
|
Signal(f'ac_an_req_wimg_i'),
|
|
Signal(f'ac_an_req_wimg_m'),
|
|
Signal(f'ac_an_req_wimg_g')
|
|
])
|
|
|
|
a2l2Rsp = Group('A2L2 Rsp', [
|
|
Signal(f'an_ac_reld_data_coming'),
|
|
Signal(f'an_ac_reld_data_vld'),
|
|
Signal(f'an_ac_reld_qw[58:59]', datafmt='dec', rjustify=True),
|
|
Signal(f'an_ac_reld_crit_qw'),
|
|
Signal(f'an_ac_reld_data[0:127]', datafmt='hex')
|
|
])
|
|
|
|
a2l2Misc = Group('A2L2 Misc', [
|
|
Signal(f'ac_an_req_pwr_token'),
|
|
Signal(f'an_ac_req_ld_pop'),
|
|
Signal(f'c{core}.lq0.lsq.arb.load_cred_cnt_q[0:4]', datafmt='dec'),
|
|
Signal(f'an_ac_req_st_pop'),
|
|
Signal(f'an_ac_req_st_gather'),
|
|
Signal(f'c{core}.lq0.lsq.arb.store_cred_cnt_q[0:5]', datafmt='dec'),
|
|
Signal(f'an_ac_reservation_vld'),
|
|
Signal(f'an_ac_stcx_complete'),
|
|
Signal(f'an_ac_stcx_pass'),
|
|
Signal(f'an_ac_sync_ack'),
|
|
Signal(f'an_ac_icbi_ack')
|
|
])
|
|
|
|
ibuf = Group('IBuf', [
|
|
Signal(f'c{core}.iuq0.iuq_slice_top0.slice0.iuq_ibuf0.buffer_valid_q[0:15]', datafmt='hex'),
|
|
Signal(f'c{core}.iuq0.iuq_slice_top0.slice0.iuq_ibuf0.buffer_head_q[0:15]', datafmt='hex')
|
|
])
|
|
for i in range(16):
|
|
ibuf.traces.append(
|
|
Signal(f'c{core}.iuq0.iuq_slice_top0.slice0.iuq_ibuf0.ibuf[{i}].q[0:109]',translateProc=filterIBuf)
|
|
)
|
|
|
|
#ibuf2 = Combined(f'IBuf[{i}]',
|
|
# [
|
|
# (Signal(f'c{core}.iuq0.iuq_slice_top0.slice0.iuq_ibuf0.buffer_valid_q[0:15]', bits=[{i}]),
|
|
# Signal(f'c{core}.iuq0.iuq_slice_top0.slice0.iuq_ibuf0.ibuf[{i}].q[0:109]')) for i in range(16)
|
|
# ]
|
|
#)
|
|
|
|
|
|
pipe = []
|
|
|
|
pipe.append(Combined('iu_xu_nia', [
|
|
Signal(f'c{core}.iuq0.iu_xu_t0_nia[0:61]'),
|
|
Signal(zero), # word-align
|
|
Signal(zero)
|
|
], datafmt='hex'))
|
|
|
|
pipe.append(ibuf)
|
|
#pipe.append(ibuf2)
|
|
|
|
for i in range(2):
|
|
pipe.append(Signal(f'c{core}.iu_rv_iu6_t0_i{i}_instr[0:31]', datafmt='hex', color=GTKWColor.green, translateProc=filterPPC))
|
|
|
|
# match cycle with instr
|
|
for i in range(2):
|
|
pipe.append(Combined(f'iu6_i{i}_itag_dispatched', [
|
|
Signal(f'c{core}.iuq0.iuq_cpl_top0.iuq_cpl0.iuq_cpl_ctrl.iu6_i{i}_dispatched_d'),
|
|
Signal(zero), # pad missing bit 0
|
|
Signal(f'c{core}.iuq0.iuq_cpl_top0.iuq_cpl0.iuq_cpl_ctrl.rn_cp_iu6_i{i}_itag[1:6]')
|
|
], color=GTKWColor.green, translateProc=filterValid))
|
|
|
|
#for i in range(2):
|
|
# pipe.append(Combined(f'iu6_i{i}_itag', [
|
|
# Signal(f'c{core}.iuq0.iuq_cpl_top0.iuq_cpl0.iuq_cpl_ctrl.iu6_i{i}_valop_q'),
|
|
# Signal(zero), # pad missing bit 0
|
|
# Signal(f'c{core}.iuq0.iuq_cpl_top0.iuq_cpl0.iuq_cpl_ctrl.iu6_i{i}_itag_q[1:6]')
|
|
# ], color=GTKWColor.blue, translateProc=filterValid))
|
|
|
|
for i in range(2):
|
|
pipe.append(Combined(f'iu6_i{i}_itag_dispatched', [
|
|
Signal(f'c{core}.iuq0.iuq_cpl_top0.iuq_cpl0.iuq_cpl_ctrl.iu6_i{i}_dispatched_q'),
|
|
Signal(zero), # pad missing bit 0
|
|
Signal(f'c{core}.iuq0.iuq_cpl_top0.iuq_cpl0.iuq_cpl_ctrl.iu6_i{i}_itag_q[1:6]')
|
|
], color=GTKWColor.green, translateProc=filterValid))
|
|
|
|
# eventually arrange all by ex
|
|
for ex in range(1):
|
|
for rv in range(2):
|
|
for fx in range(2):
|
|
for src in range(1,4):
|
|
pipe.append(Combined(f'rv0_fx{fx}_ex{ex}_s{src}', [
|
|
Signal(f'c{core}.rv_fx{fx}_ex{ex}_s{src}_v'),
|
|
Signal(f'c{core}.rv0.rf_byp.fx{fx}_ex{ex}_s{src}_itag_q[0:6]')
|
|
], color=GTKWColor.blue, translateProc=filterValid))
|
|
|
|
for ex in range(6):
|
|
for fx in range(2):
|
|
pipe.append(Combined(f'fx{fx}_ex{ex}', [
|
|
Signal(f'c{core}.xu0.xu{fx}.dec.ex{ex}_val_q[0]'),
|
|
Signal(f'c{core}.xu0.xu{fx}.dec.ex{ex}_itag_q[0:6]')
|
|
], color=GTKWColor.blue, translateProc=filterValid))
|
|
|
|
for ex in range(4):
|
|
pipe.append(Combined(f'br_ex{ex}_bta', [
|
|
Signal(f'c{core}.xu0.xu0.br.ex{ex}_bta_val_q'),
|
|
Signal(f'c{core}.xu0.xu0.br.ex{ex}_pred_bta_q[42:61]'),
|
|
Signal(zero), # word-align
|
|
Signal(zero)
|
|
], color=GTKWColor.blue, translateProc=filterValid))
|
|
|
|
|
|
for i in range(2):
|
|
pipe.append(Combined(f'cp2 i{i}_completed_itag', [
|
|
Signal(f'c{core}.iu_lq_i{i}_completed'),
|
|
Signal(f'c{core}.iu_lq_t0_i{i}_completed_itag[0:6]'),
|
|
], color=GTKWColor.green, translateProc=filterValid))
|
|
|
|
for i in range(2):
|
|
pipe.append(Combined(f'cp2 i{i}_completed_ifar', [
|
|
Signal(f'c{core}.iuq0.iuq_cpl_top0.iuq_cpl0.iuq_cpl_ctrl.cp2_i{i}_complete_q'),
|
|
Signal(f'c{core}.iuq0.iuq_cpl_top0.iuq_cpl0.cp2_i{i}_ifar[42:61]'),
|
|
Signal(zero), # word-align
|
|
Signal(zero)
|
|
], color=GTKWColor.green, translateProc=filterValid))
|
|
|
|
# or add more stuff and make transaction
|
|
for i in range(2):
|
|
pipe.append(Combined(f'cp2 i{i}_completed_itag/ifar', [
|
|
Signal(f'c{core}.iu_lq_i{i}_completed'),
|
|
Signal(zero), # pad itag
|
|
Signal(f'c{core}.iu_lq_t0_i{i}_completed_itag[0:6]'),
|
|
Signal(zero), # pad ifar
|
|
Signal(zero), # pad
|
|
Signal(f'c{core}.iuq0.iuq_cpl_top0.iuq_cpl0.cp2_i{i}_ifar[42:61]'),
|
|
Signal(zero), # word-align
|
|
Signal(zero)
|
|
], color=GTKWColor.green, translateProc=filterValid))
|
|
|
|
|
|
pipe = Group('Pipe', pipe, closed=False)
|
|
|
|
|
|
threads = 1
|
|
sprs = [None] * threads
|
|
for i in range(threads):
|
|
sprs[i] = Group(f't{i} SPR', [
|
|
Signal(f'c{core}.xu0.spr.threads.thread[{i}].xu_spr_tspr.srr0_do[0:64]', datafmt='bin', translateProc=filterR64),
|
|
Signal(f'c{core}.xu0.spr.threads.thread[{i}].xu_spr_tspr.srr1_do[0:64]', datafmt='bin', translateProc=filterR64)
|
|
], closed=False)
|
|
|
|
a2l2Req.add()
|
|
a2l2Rsp.add()
|
|
a2l2Misc.add()
|
|
|
|
# move this after and it works
|
|
#a2l2Req.addCombined('A2L2 Trans (Req)', transactionProc=filterA2L2)
|
|
|
|
pipe.add()
|
|
sprs[0].add()
|
|
|
|
a2l2Req.addCombined('A2L2 Trans (Req)', transactionProc=filterA2L2)
|
|
|
|
#for i in range(len(groups)):
|
|
# groups[i].add()
|
|
|
|
|
|
#gtkw.comment('Test pyvcd')
|
|
#gtkw.savefile(gtkwFile)
|
|
#gtkw.zoom_markers()
|
|
#gtkw.pos()
|
|
|
|
gtkw.sst_expanded(True)
|
|
gtkw.size(3000, 1500)
|
|
gtkw.treeopen(base)
|
|
gtkw.signals_width(600)
|
|
gtkw.pattern_trace(True)
|
|
|
|
|
|
fo.close() |