enable automatic pin bind

This commit is contained in:
Chen Lu 2022-02-15 21:40:15 +08:00
parent c279fa50eb
commit e971c9338d
9 changed files with 253 additions and 43 deletions

3
.gitignore vendored
View File

@ -6,4 +6,5 @@
!makefile
!LICENSE
!README.md
!README.en.md
!README.en.md
!board/*

View File

@ -37,10 +37,15 @@ $(DST_BIN): $(SRCS) $(NBD_ARCHIVE)
$(addprefix -CFLAGS , $(CFLAGS)) $(addprefix -LDFLAGS , $(LDFLAGS)) \
--Mdir $(OBJ_DIR) --exe -o $(DST_EXE)
run: $(DST_BIN)
CONS_FILES ?= $(shell find $(SRC_DIR) -name "*.cons")
cons: $(CONS_FILES)
python $(NVBOARD_HOME)/scripts/auto_pin_bind.py $(CONS_FILES)
run: $(DST_BIN) cons
@$(DST_BIN)
clean:
rm -rf $(OBJ_DIR)
.PHONY: clean run
.PHONY: clean run cons

97
board/N4 Normal file
View File

@ -0,0 +1,97 @@
input CLK
input BTNC
input BTNU
input BTND
input BTNL
input BTNR
input RST
input SW0
input SW1
input SW2
input SW3
input SW4
input SW5
input SW6
input SW7
input SW8
input SW9
input SW10
input SW11
input SW12
input SW13
input SW14
input SW15
output LD0
output LD1
output LD2
output LD3
output LD4
output LD5
output LD6
output LD7
output LD8
output LD9
output LD10
output LD11
output LD12
output LD13
output LD14
output LD15
output R16
output G16
output B16
output R17
output G17
output B17
output AN0
output AN1
output AN2
output AN3
output AN4
output AN5
output AN6
output AN7
output SEGA
output SEGB
output SEGC
output SEGD
output SEGE
output SEGF
output SEGG
output DECP
output VGA_CLK
output VGA_VSYNC
output VGA_HSYNC
output VGA_BLANK_N
output VGA_R0
output VGA_R1
output VGA_R2
output VGA_R3
output VGA_R4
output VGA_R5
output VGA_R6
output VGA_R7
output VGA_G0
output VGA_G1
output VGA_G2
output VGA_G3
output VGA_G4
output VGA_G5
output VGA_G6
output VGA_G7
output VGA_B0
output VGA_B1
output VGA_B2
output VGA_B3
output VGA_B4
output VGA_B5
output VGA_B6
output VGA_B7

1
emu/.gitignore vendored
View File

@ -1,3 +1,4 @@
!src/*
!Makefile
!makefile
auto_bind.cpp

View File

@ -6,50 +6,16 @@ static TOP_NAME dut;
void nvboard_init();
void nvboard_quit();
void nvboard_update_all();
void nvboard_update();
void nvboard_bind_pins(Vtop* top);
int main() {
nvboard_bind_pin(output_pin::VGA_CLK, &dut.VGA_CLK);
nvboard_bind_pin(output_pin::VGA_VSYNC, &dut.VGA_VSYNC);
nvboard_bind_pin(output_pin::VGA_HSYNC, &dut.VGA_HSYNC);
nvboard_bind_pin(output_pin::VGA_BLANK_N, &dut.VGA_BLANK_N);
vector<output_pin> vgaR_pins = {
output_pin::VGA_R7, output_pin::VGA_R6, output_pin::VGA_R5, output_pin::VGA_R4,
output_pin::VGA_R3, output_pin::VGA_R2, output_pin::VGA_R1, output_pin::VGA_R0
};
nvboard_bind_pin(vgaR_pins, &dut.VGA_R);
vector<output_pin> vgaG_pins = {
output_pin::VGA_G7, output_pin::VGA_G6, output_pin::VGA_G5, output_pin::VGA_G4,
output_pin::VGA_G3, output_pin::VGA_G2, output_pin::VGA_G1, output_pin::VGA_G0
};
nvboard_bind_pin(vgaG_pins, &dut.VGA_G);
vector<output_pin> vgaB_pins = {
output_pin::VGA_B7, output_pin::VGA_B6, output_pin::VGA_B5, output_pin::VGA_B4,
output_pin::VGA_B3, output_pin::VGA_B2, output_pin::VGA_B1, output_pin::VGA_B0
};
nvboard_bind_pin(vgaB_pins, &dut.VGA_B);
vector<output_pin> led_pins = {
output_pin::LD15, output_pin::LD14, output_pin::LD13, output_pin::LD12,
output_pin::LD11, output_pin::LD10, output_pin::LD9, output_pin::LD8,
output_pin::LD7, output_pin::LD6, output_pin::LD5, output_pin::LD4,
output_pin::LD3, output_pin::LD2, output_pin::LD1, output_pin::LD0
};
nvboard_bind_pin(led_pins, &dut.ledr);
vector<input_pin> sw_pins = {
input_pin::SW7, input_pin::SW6, input_pin::SW5, input_pin::SW4,
input_pin::SW3, input_pin::SW2, input_pin::SW1, input_pin::SW0
};
nvboard_bind_pin(sw_pins, &dut.sw);
nvboard_bind_pins(&dut);
nvboard_init();
while(1){
nvboard_update_all();
nvboard_update();
dut.clk = !dut.clk;
dut.eval();
}

13
emu/src/top.cons Normal file
View File

@ -0,0 +1,13 @@
top=top
VGA_CLK VGA_CLK
VGA_VSYNC VGA_VSYNC
VGA_HSYNC VGA_HSYNC
VGA_BLANK_N VGA_BLANK_N
VGA_R (VGA_R7, VGA_R6, VGA_R5, VGA_R4, VGA_R3, VGA_R2, VGA_R1, VGA_R0)
VGA_G (VGA_G7, VGA_G6, VGA_G5, VGA_G4, VGA_G3, VGA_G2, VGA_G1, VGA_G0)
VGA_B (VGA_B7, VGA_B6, VGA_B5, VGA_B4, VGA_B3, VGA_B2, VGA_B1, VGA_B0)
ledr (LD15, LD14, LD13, LD12, LD11, LD10, LD9, LD8, LD7, LD6, LD5, LD4, LD3, LD2, LD1, LD0)
sw (SW7, SW6, SW5, SW4, SW3, SW2, SW1, SW0)

3
scripts/.gitignore vendored
View File

@ -1 +1,2 @@
!*.mk
!*.mk
!*.py

126
scripts/auto_pin_bind.py Normal file
View File

@ -0,0 +1,126 @@
import sys
import re
import os
def inout_dict(file_path):
f = open(file_path, "r")
inout = {}
line = f.readline()
while line:
line = line.strip(' \n')
line = line.split(' ')
if len(line) == 2:
inout[line[1].replace(' ', '')] = line[0].replace(' ', '')
line = f.readline()
return inout
def write_line_dep(f, output_str):
global dep, start_of_line
if(len(output_str) == 0):
return
if(output_str == "\n"):
start_of_line = True
f.write('\n')
return
dep = dep - output_str.count('}')
if start_of_line:
for i in range(dep):
f.write('\t')
f.write(output_str)
start_of_line = output_str[-1] == '\n'
dep = dep + output_str.count('{')
if dep < 0:
print("invalid syntax")
exit(-1)
def write_dep(f, output_str):
lines = re.split('(\n)', output_str)
for line in lines:
write_line_dep(f, line)
def check_pin_valid(inout, pin):
if inout.get(pin, -1) == -1:
print("invalid pin " + pin)
exit(1)
def bind_pin(f, inout, signal, pin):
pin = pin.replace(' ', '')
check_pin_valid(inout, pin)
signal_addr = "&top->" + signal
pin_full = inout[pin] + "_pin::" + pin
write_dep(bind_f, "nvboard_bind_pin(" + pin_full + ", " + signal_addr + ");\n")
def bind_vec_pins(f, inout, signal, pins):
vec_name = signal + "_pins"
for idx in range(len(pins)):
pins[idx] = pins[idx].replace(' ', '')
check_pin_valid(inout, pins[idx])
write_dep(bind_f, "vector<" + inout[pins[0]] + "_pin> " + vec_name + "{\n")
signal_addr = "&top->" + signal
for idx in range(len(pins)):
if idx != 0:
write_dep(bind_f, ", ")
if idx % 4 == 0 and idx != 0:
write_dep(bind_f, "\n")
write_dep(bind_f, inout[pins[idx]] + "_pin::" + pins[idx])
write_dep(bind_f, "\n};\n")
write_dep(bind_f, "nvboard_bind_pin(" + vec_name + ", " + signal_addr + ");\n")
def init_info(f, top):
write_dep(bind_f, "#include <nvboard.h>\n#include \"V" + top + ".h\"\n\nvoid nvboard_bind_pins(V" + top + "* top){\n")
dep = 0
start_of_line = True
nvboard_path = os.environ.get('NVBOARD_HOME')
inout = inout_dict(nvboard_path + "/board/N4")
if len(sys.argv) <= 1:
print("constrait file missing!")
exit(-1)
cons_path = sys.argv[1]
cons_f = open(cons_path, "r")
bind_f = open('src/auto_bind.cpp', "w")
line = cons_f.readline()
line = line.split('=')
if not line or len(line) <= 1:
print("top module should be specified at the top of constraint file, usage: top=top_name")
exit(-1)
top = line[1].strip(' \n')
init_info(bind_f, top)
line = cons_f.readline()
while line:
line = line.strip(')\n')
line = line.split('(')
if(len(line) == 1):
line = line[0].split(' ')
if len(line) == 1:
line = cons_f.readline()
continue
signal = line[0].strip(' ')
pins = line[1].split(',')
if len(pins) == 1:
bind_pin(bind_f, inout, signal, pins[0])
else:
bind_vec_pins(bind_f, inout, signal, pins)
line = cons_f.readline()
write_dep(bind_f, "}")

View File

@ -76,7 +76,7 @@ static void nvboard_update_all_output() {
}
}
void nvboard_update_all() {
void nvboard_update() {
nvboard_update_all_input();
nvboard_update_all_output();