You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

310 lines
11 KiB
Plaintext

2 years ago
#!/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()