Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a script for testing LiteScope #22

Merged
merged 1 commit into from
Jul 28, 2020
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 115 additions & 0 deletions examples/test/test_litescope.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
#!/usr/bin/env python3

# This file is Copyright (c) 2020 Antmicro <www.antmicro.com>
# License: BSD

import re
import csv
import sys
import argparse

from litex import RemoteClient
from litescope import LiteScopeAnalyzerDriver

# Helpers ------------------------------------------------------------------------------------------

def get_signals(csvname):
signals = []
with open(csvname) as f:
reader = csv.reader(f, delimiter=",", quotechar="#")
for typ, group, name, value in reader:
if typ == "signal":
signals.append(name)
return signals

class Finder:
def __init__(self, signals):
self.signals = signals

def __getitem__(self, name):
scores = {s: 0 for s in signals}
# exact match
if name in scores:
print("Exact:", name)
return name
# substring
pattern = re.compile(name)
max_score = 0
for s in signals:
match = pattern.search(s)
if match:
scores[s] = match.end() - match.start()
max_score = max(scores.values())
best = list(filter(lambda kv: kv[1] == max_score, scores.items()))
assert len(best) == 1, f"Found multiple candidates: {best}"
name, score = best[0]
return name

# Main script --------------------------------------------------------------------------------------

def parse_args():
parser = argparse.ArgumentParser(description="""Run LiteScope with selected triggers

Allows to add triggers based on signal names. Supports simple substring matching
and Python regular expressions.
""")
parser.add_argument("-r", "--rising-edge", action="append", help="Add rising edge trigger")
parser.add_argument("-f", "--falling-edge", action="append", help="Add falling edge trigger")
parser.add_argument("-v", "--value-trigger", action="append", nargs=2, help="Add conditional trigger with given value",
metavar=("TRIGGER", "VALUE"))
parser.add_argument("-l", "--list", action="store_true", help="List signal choices")
parser.add_argument("--offset", default="32", help="Capture Offset.")
parser.add_argument("--length", default="128", help="Capture Length.")
args = parser.parse_args()
return args

def add_triggers(args, analyzer, signals):
added = False
finder = Finder(signals)

for signal in args.rising_edge or []:
name = finder[signal]
analyzer.add_rising_edge_trigger(name)
print(f"Rising edge: {name}")
added = True
for signal in args.falling_edge or []:
name = finder[signal]
analyzer.add_falling_edge_trigger(finder[signal])
print(f"Falling edge: {name}")
added = True
cond = {}
for signal, value in args.value_trigger or []:
name = finder[signal]
value = int(value, 0)
cond[finder[signal]] = value
print(f"Condition: {name} == {value}")
if cond:
analyzer.add_trigger(cond=cond)
added = True
return added

if __name__ == "__main__":
args = parse_args()

signals = get_signals("analyzer.csv")
if args.list:
for signal in signals:
print(signal)
sys.exit(0)

wb = RemoteClient()
wb.open()

try:
analyzer = LiteScopeAnalyzerDriver(wb.regs, "analyzer", debug=True)
analyzer.configure_group(0)
if not add_triggers(args, analyzer, signals):
print("WARNING: no trigger added!")

analyzer.run(offset=int(args.offset, 0), length=int(args.length, 0))

analyzer.wait_done()
analyzer.upload()
analyzer.save("dump.vcd")
finally:
wb.close()