50 lines
1.4 KiB
Python
Executable File
50 lines
1.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Independent golden models for L03; no RTL implementation is imported."""
|
|
|
|
import sys
|
|
|
|
|
|
def task01() -> None:
|
|
counter = 0
|
|
previous = 0
|
|
pulses = 0
|
|
consecutive = 0
|
|
for _ in range(16):
|
|
enable = int(counter == 3)
|
|
counter = 0 if enable else counter + 1
|
|
pulses += enable
|
|
consecutive += int(enable and previous)
|
|
previous = enable
|
|
assert (pulses, consecutive, counter) == (4, 0, 0)
|
|
print("PASS task01 pulses=4 consecutive=0 final_count=0")
|
|
|
|
|
|
def task02() -> None:
|
|
sequence = []
|
|
counter = 0
|
|
for _ in range(16):
|
|
counter = (counter + 1) & 0xF
|
|
sequence.append((counter >> 2) & 1)
|
|
edges = [index + 1 for index in range(16) if sequence[index] != (sequence[index - 1] if index else 0)]
|
|
assert edges == [4, 8, 12, 16]
|
|
print("PASS task02 led_edges=4,8,12,16 period=8")
|
|
|
|
|
|
def task03() -> None:
|
|
pattern = [0x1, 0x2, 0x4, 0x8, 0x8, 0x4, 0x2, 0x1]
|
|
observed = [pattern[index & 7] for index in range(10)]
|
|
assert observed == [1, 2, 4, 8, 8, 4, 2, 1, 1, 2]
|
|
print("PASS task03 pattern=1,2,4,8,8,4,2,1 wrap=1,2")
|
|
|
|
|
|
TASKS = {
|
|
"task01_clock_enable": task01,
|
|
"task02_counter_blinker": task02,
|
|
"task03_pattern_rom": task03,
|
|
}
|
|
|
|
|
|
if len(sys.argv) != 2 or sys.argv[1] not in TASKS:
|
|
raise SystemExit(f"usage: {sys.argv[0]} {'|'.join(TASKS)}")
|
|
TASKS[sys.argv[1]]()
|