diff --git a/fuzzers/051-imuxlout/generate.tcl b/fuzzers/051-imuxlout/generate.tcl index 44a47cbe..9e0ea29c 100644 --- a/fuzzers/051-imuxlout/generate.tcl +++ b/fuzzers/051-imuxlout/generate.tcl @@ -30,7 +30,6 @@ close $fp set int_l_tiles [randsample_list [llength $todo_lines] [filter [pblock_tiles roi] {TYPE == INT_L}]] set int_r_tiles [randsample_list [llength $todo_lines] [filter [pblock_tiles roi] {TYPE == INT_R}]] -set idx 0 for {set idx 0} {$idx < [llength $todo_lines]} {incr idx} { set line [lindex $todo_lines $idx] diff --git a/fuzzers/053-ctrlin/.gitignore b/fuzzers/053-ctrlin/.gitignore new file mode 100644 index 00000000..9c926485 --- /dev/null +++ b/fuzzers/053-ctrlin/.gitignore @@ -0,0 +1,13 @@ +/filtered_seg_int_l.segbits +/filtered_seg_int_r.segbits +/pattern_l.txt +/pattern_r.txt +/piplist.dcp +/piplist/ +/pips_int_l.txt +/pips_int_r.txt +/seg_int_l.segbits +/seg_int_r.segbits +/specimen_[0-9][0-9][0-9]/ +/todo.txt +/vivado* diff --git a/fuzzers/053-ctrlin/Makefile b/fuzzers/053-ctrlin/Makefile new file mode 100644 index 00000000..3edb4f05 --- /dev/null +++ b/fuzzers/053-ctrlin/Makefile @@ -0,0 +1,29 @@ + +N := 10 +SPECIMENS := $(addprefix specimen_,$(shell seq -f '%03.0f' $(N))) +SPECIMENS_OK := $(addsuffix /OK,$(SPECIMENS)) + +database: $(SPECIMENS_OK) + ${XRAY_SEGMATCH} -m 5 -M 15 -o seg_int_l.segbits $(addsuffix /segdata_clbl[lm]_l.txt,$(SPECIMENS)) + ${XRAY_SEGMATCH} -m 5 -M 15 -o seg_int_r.segbits $(addsuffix /segdata_clbl[lm]_r.txt,$(SPECIMENS)) + +pushdb: + ${XRAY_MERGEDB} int_l seg_int_l.segbits + ${XRAY_MERGEDB} int_r seg_int_r.segbits + ${XRAY_DBFIXUP} + +$(SPECIMENS_OK): todo.txt + bash generate.sh $(subst /OK,,$@) + touch $@ + +todo.txt: + vivado -mode batch -source piplist.tcl + python3 maketodo.py | sort -R | head -n10 > todo.txt + +clean: + rm -rf .Xil/ .cache/ filtered_seg_int_[lr].segbits + rm -rf todo.txt vivado* piplist/ piplist.dcp pattern_[lr].txt pips_int_[lr].txt + rm -rf specimen_[0-9][0-9][0-9]/ seg_int_[lr].segbits mask_clbl[lm]_[lr].segbits + +.PHONY: database pushdb clean + diff --git a/fuzzers/053-ctrlin/generate.py b/fuzzers/053-ctrlin/generate.py new file mode 100644 index 00000000..ff02451a --- /dev/null +++ b/fuzzers/053-ctrlin/generate.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 + +import sys, os, re + +sys.path.append("../../../utils/") +from segmaker import segmaker + +segmk = segmaker("design.bits") + +tiledata = dict() +pipdata = dict() +ignpip = set() + +print("Loading tags from design.txt.") +with open("design.txt", "r") as f: + for line in f: + tile, pip, src, dst, pnum, pdir = line.split() + _, pip = pip.split(".") + _, src = src.split("/") + _, dst = dst.split("/") + pnum = int(pnum) + pdir = int(pdir) + + if tile not in tiledata: + tiledata[tile] = { + "pips": set(), + "srcs": set(), + "dsts": set() + } + + if pip in pipdata: + assert pipdata[pip] == (src, dst) + else: + pipdata[pip] = (src, dst) + + tiledata[tile]["pips"].add(pip) + tiledata[tile]["srcs"].add(src) + tiledata[tile]["dsts"].add(dst) + + if pdir == 0: + tiledata[tile]["srcs"].add(dst) + tiledata[tile]["dsts"].add(src) + + if pnum == 1 or pdir == 0 or not re.match(r"^CTRL", dst): + ignpip.add(pip) + +for tile, pips_srcs_dsts in tiledata.items(): + pips = pips_srcs_dsts["pips"] + srcs = pips_srcs_dsts["srcs"] + dsts = pips_srcs_dsts["dsts"] + + for pip, src_dst in pipdata.items(): + src, dst = src_dst + if pip in ignpip: + pass + elif pip in pips: + segmk.addtag(tile, "%s.%s" % (dst, src), 1) + elif src_dst[1] not in dsts: + segmk.addtag(tile, "%s.%s" % (dst, src), 0) + +def bitfilter(frame_idx, bit_idx): + assert os.getenv("XRAY_DATABASE") == "artix7" + return True + if frame_idx == 0 and bit_idx == 48: + return False + if frame_idx == 1 and bit_idx == 31: + return False + return frame_idx in [0, 1] + +segmk.compile(bitfilter=bitfilter) +segmk.write() + diff --git a/fuzzers/053-ctrlin/generate.sh b/fuzzers/053-ctrlin/generate.sh new file mode 100644 index 00000000..9f904105 --- /dev/null +++ b/fuzzers/053-ctrlin/generate.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +source ${XRAY_GENHEADER} + +vivado -mode batch -source ../generate.tcl + +${XRAY_BITREAD} -F $XRAY_ROI_FRAMES -o design.bits -z -y design.bit +python3 ../generate.py + diff --git a/fuzzers/053-ctrlin/generate.tcl b/fuzzers/053-ctrlin/generate.tcl new file mode 100644 index 00000000..6bdaf747 --- /dev/null +++ b/fuzzers/053-ctrlin/generate.tcl @@ -0,0 +1,85 @@ +create_project -force -part $::env(XRAY_PART) design design + +read_verilog ../top.v +synth_design -top top + +set_property -dict "PACKAGE_PIN $::env(XRAY_PIN_00) IOSTANDARD LVCMOS33" [get_ports i] +set_property -dict "PACKAGE_PIN $::env(XRAY_PIN_01) IOSTANDARD LVCMOS33" [get_ports o] + +create_pblock roi +resize_pblock [get_pblocks roi] -add "$::env(XRAY_ROI)" + +set_property CFGBVS VCCO [current_design] +set_property CONFIG_VOLTAGE 3.3 [current_design] +set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design] + +place_design +route_design + +# write_checkpoint -force design.dcp + +source ../../../utils/utils.tcl + +set fp [open "../todo.txt" r] +set todo_lines {} +for {gets $fp line} {$line != ""} {gets $fp line} { + lappend todo_lines [split $line .] +} +close $fp + +set int_l_tiles [randsample_list [llength $todo_lines] [filter [pblock_tiles roi] {TYPE == INT_L}]] +set int_r_tiles [randsample_list [llength $todo_lines] [filter [pblock_tiles roi] {TYPE == INT_R}]] + +for {set idx 0} {$idx < [llength $todo_lines]} {incr idx} { + set line [lindex $todo_lines $idx] + puts "== $idx: $line" + + set tile_type [lindex $line 0] + set dst_wire [lindex $line 1] + set src_wire [lindex $line 2] + + if {$tile_type == "INT_L"} {set tile [lindex $int_l_tiles $idx]; set other_tile [lindex $int_r_tiles $idx]} + if {$tile_type == "INT_R"} {set tile [lindex $int_r_tiles $idx]; set other_tile [lindex $int_l_tiles $idx]} + + set driver_site [get_sites -of_objects [get_site_pins -of_objects [get_nodes -downhill \ + -of_objects [get_nodes -of_objects [get_wires $other_tile/CLK*0]]]]] + + set recv_site [get_sites -of_objects [get_site_pins -of_objects [get_nodes -downhill \ + -of_objects [get_nodes -of_objects [get_wires $tile/$dst_wire]]]]] + + set mylut [create_cell -reference LUT1 mylut_$idx] + set_property -dict "LOC $driver_site BEL A6LUT" $mylut + + set myff [create_cell -reference FDRE myff_$idx] + set ffbel [lindex "AFF A5FF BFF B5FF CFF C5FF DFF D5FF" [expr {int(rand()*8)}]] + set_property -dict "LOC $recv_site BEL $ffbel" $myff + + set mynet [create_net mynet_$idx] + connect_net -net $mynet -objects "$mylut/O $myff/R" + route_via $mynet "$tile/$src_wire $tile/$dst_wire" +} + +proc write_txtdata {filename} { + puts "Writing $filename." + set fp [open $filename w] + set all_pips [lsort -unique [get_pips -of_objects [get_nets -hierarchical]]] + if {$all_pips != {}} { + puts "Dumping pips." + foreach tile [get_tiles [regsub -all {CLBL[LM]} [get_tiles -of_objects [get_sites -of_objects [get_pblocks roi]]] INT]] { + foreach pip [filter $all_pips "TILE == $tile"] { + set src_wire [get_wires -uphill -of_objects $pip] + set dst_wire [get_wires -downhill -of_objects $pip] + set num_pips [llength [get_nodes -uphill -of_objects [get_nodes -of_objects $dst_wire]]] + set dir_prop [get_property IS_DIRECTIONAL $pip] + puts $fp "$tile $pip $src_wire $dst_wire $num_pips $dir_prop" + } + } + } + close $fp +} + +route_design +write_checkpoint -force design.dcp +write_bitstream -force design.bit +write_txtdata design.txt + diff --git a/fuzzers/053-ctrlin/maketodo.py b/fuzzers/053-ctrlin/maketodo.py new file mode 100644 index 00000000..29c66f6f --- /dev/null +++ b/fuzzers/053-ctrlin/maketodo.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python3 + +import os, re + +def maketodo(pipfile, dbfile): + todos = set() + with open(pipfile, "r") as f: + for line in f: + line = line.split() + todos.add(line[0]) + with open(dbfile, "r") as f: + for line in f: + line = line.split() + todos.remove(line[0]) + for line in todos: + if re.match(r"^INT_[LR].CTRL", line): + print(line) + +maketodo("pips_int_l.txt", "%s/%s/segbits_int_l.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"))) +maketodo("pips_int_r.txt", "%s/%s/segbits_int_r.db" % (os.getenv("XRAY_DATABASE_DIR"), os.getenv("XRAY_DATABASE"))) + diff --git a/fuzzers/053-ctrlin/piplist.tcl b/fuzzers/053-ctrlin/piplist.tcl new file mode 100644 index 00000000..98a590a6 --- /dev/null +++ b/fuzzers/053-ctrlin/piplist.tcl @@ -0,0 +1,39 @@ +create_project -force -part $::env(XRAY_PART) piplist piplist + +read_verilog top.v +synth_design -top top + +set_property -dict "PACKAGE_PIN $::env(XRAY_PIN_00) IOSTANDARD LVCMOS33" [get_ports i] +set_property -dict "PACKAGE_PIN $::env(XRAY_PIN_01) IOSTANDARD LVCMOS33" [get_ports o] + +create_pblock roi +resize_pblock [get_pblocks roi] -add "$::env(XRAY_ROI)" + +set_property CFGBVS VCCO [current_design] +set_property CONFIG_VOLTAGE 3.3 [current_design] +set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design] + +place_design +route_design + +write_checkpoint -force piplist.dcp + +source ../../utils/utils.tcl + +proc print_tile_pips {tile_type filename} { + set tile [lindex [get_tiles -filter "TYPE == $tile_type"] 0] + puts "Dumping and PIPs for tile $tile ($tile_type) to $filename." + set fp [open $filename w] + foreach pip [lsort [get_pips -filter {IS_DIRECTIONAL} -of_objects [get_tiles $tile]]] { + set src [get_wires -uphill -of_objects $pip] + set dst [get_wires -downhill -of_objects $pip] + if {[llength [get_nodes -uphill -of_objects [get_nodes -of_objects $dst]]] != 1} { + puts $fp "$tile_type.[regsub {.*/} $dst ""].[regsub {.*/} $src ""]" + } + } + close $fp +} + +print_tile_pips INT_L pips_int_l.txt +print_tile_pips INT_R pips_int_r.txt + diff --git a/fuzzers/053-ctrlin/top.v b/fuzzers/053-ctrlin/top.v new file mode 100644 index 00000000..c0e91c58 --- /dev/null +++ b/fuzzers/053-ctrlin/top.v @@ -0,0 +1,3 @@ +module top (input i, output o); + assign o = i; +endmodule