67 lines
2.1 KiB
Python
67 lines
2.1 KiB
Python
from migen.fhdl.structure import *
|
|
from migen.sim.generic import Proxy
|
|
|
|
class CommandLogger:
|
|
def __init__(self, cmd):
|
|
self.cmd = cmd
|
|
|
|
def do_simulation(self, s):
|
|
elts = ["@" + str(s.cycle_counter)]
|
|
|
|
cmdp = Proxy(s, self.cmd)
|
|
if not cmdp.ras_n and cmdp.cas_n and cmdp.we_n:
|
|
elts.append("ACTIVATE")
|
|
elts.append("BANK " + str(cmdp.ba))
|
|
elts.append("ROW " + str(cmdp.a))
|
|
elif cmdp.ras_n and not cmdp.cas_n and cmdp.we_n:
|
|
elts.append("READ\t")
|
|
elts.append("BANK " + str(cmdp.ba))
|
|
elts.append("COL " + str(cmdp.a))
|
|
elif cmdp.ras_n and not cmdp.cas_n and not cmdp.we_n:
|
|
elts.append("WRITE\t")
|
|
elts.append("BANK " + str(cmdp.ba))
|
|
elts.append("COL " + str(cmdp.a))
|
|
elif cmdp.ras_n and cmdp.cas_n and not cmdp.we_n:
|
|
elts.append("BST")
|
|
elif not cmdp.ras_n and not cmdp.cas_n and cmdp.we_n:
|
|
elts.append("AUTO REFRESH")
|
|
elif not cmdp.ras_n and cmdp.cas_n and not cmdp.we_n:
|
|
elts.append("PRECHARGE")
|
|
if cmdp.a & 2**10:
|
|
elts.append("ALL")
|
|
else:
|
|
elts.append("BANK " + str(cmdp.ba))
|
|
elif not cmdp.ras_n and not cmdp.cas_n and not cmdp.we_n:
|
|
elts.append("LMR")
|
|
|
|
if len(elts) > 1:
|
|
print("\t".join(elts))
|
|
|
|
def get_fragment(self):
|
|
return Fragment(sim=[self.do_simulation])
|
|
|
|
class SlotsLogger:
|
|
def __init__(self, slicer, slots):
|
|
self.slicer = slicer
|
|
self.slots = slots
|
|
|
|
def do_simulation(self, sim):
|
|
state_strs = ["EMPTY", "PEND", "PRCESS"]
|
|
rw_strs = ["RD", "WR"]
|
|
print("\t" + "\t".join([str(x) for x in range(len(self.slots))]))
|
|
print("State:\t" + "\t".join([state_strs[sim.rd(s.state)] for s in self.slots]))
|
|
print("RW:\t" + "\t".join([rw_strs[sim.rd(s.we)] for s in self.slots]))
|
|
print("Row:\t" + "\t".join([str(self.slicer.row(sim.rd(s.adr))) for s in self.slots]))
|
|
print("Bank:\t" + "\t".join([str(self.slicer.bank(sim.rd(s.adr))) for s in self.slots]))
|
|
print("Col:\t" + "\t".join([str(self.slicer.col(sim.rd(s.adr))) for s in self.slots]))
|
|
times = []
|
|
for s in self.slots:
|
|
if s.time:
|
|
times.append(str(sim.rd(s._counter)) + "/" + str(s.time))
|
|
else:
|
|
times.append("N/A")
|
|
print("Time:\t" + "\t".join(times))
|
|
|
|
def get_fragment(self):
|
|
return Fragment(sim=[self.do_simulation])
|