enable automatic pin bind
This commit is contained in:
parent
c279fa50eb
commit
e971c9338d
|
@ -6,4 +6,5 @@
|
|||
!makefile
|
||||
!LICENSE
|
||||
!README.md
|
||||
!README.en.md
|
||||
!README.en.md
|
||||
!board/*
|
9
Makefile
9
Makefile
|
@ -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
|
|
@ -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,3 +1,4 @@
|
|||
!src/*
|
||||
!Makefile
|
||||
!makefile
|
||||
auto_bind.cpp
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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)
|
|
@ -1 +1,2 @@
|
|||
!*.mk
|
||||
!*.mk
|
||||
!*.py
|
|
@ -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, "}")
|
|
@ -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();
|
||||
|
||||
|
|
Loading…
Reference in New Issue