From e51535ddbf369a27ba00bbf8f3975b3532f86f92 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Sat, 18 Nov 2017 04:59:16 +0100 Subject: [PATCH] Add 051-intpips2 fuzzer Signed-off-by: Clifford Wolf Signed-off-by: Tim 'mithro' Ansell --- fuzzers/051-intpips2/.gitignore | 13 +++++ fuzzers/051-intpips2/Makefile | 31 +++++++++++ fuzzers/051-intpips2/generate.py | 83 ++++++++++++++++++++++++++++++ fuzzers/051-intpips2/generate.sh | 12 +++++ fuzzers/051-intpips2/generate.tcl | 85 +++++++++++++++++++++++++++++++ fuzzers/051-intpips2/maketodo.py | 24 +++++++++ fuzzers/051-intpips2/piplist.tcl | 39 ++++++++++++++ fuzzers/051-intpips2/top.v | 3 ++ utils/utils.tcl | 2 +- 9 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 fuzzers/051-intpips2/.gitignore create mode 100644 fuzzers/051-intpips2/Makefile create mode 100644 fuzzers/051-intpips2/generate.py create mode 100644 fuzzers/051-intpips2/generate.sh create mode 100644 fuzzers/051-intpips2/generate.tcl create mode 100644 fuzzers/051-intpips2/maketodo.py create mode 100644 fuzzers/051-intpips2/piplist.tcl create mode 100644 fuzzers/051-intpips2/top.v diff --git a/fuzzers/051-intpips2/.gitignore b/fuzzers/051-intpips2/.gitignore new file mode 100644 index 00000000..9c926485 --- /dev/null +++ b/fuzzers/051-intpips2/.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/051-intpips2/Makefile b/fuzzers/051-intpips2/Makefile new file mode 100644 index 00000000..1daf68d0 --- /dev/null +++ b/fuzzers/051-intpips2/Makefile @@ -0,0 +1,31 @@ + +N := 100 +SPECIMENS := $(addprefix specimen_,$(shell seq -f '%03.0f' $(N))) +SPECIMENS_OK := $(addsuffix /OK,$(SPECIMENS)) + +database: $(SPECIMENS_OK) + grep '^INT_L\.' todo.txt | sed 's/INT_L\./^INT./; s/$$/ ./;' > pattern_l.txt + grep '^INT_R\.' todo.txt | sed 's/INT_R\./^INT./; s/$$/ ./;' > pattern_r.txt + ${XRAY_SEGMATCH} -m 5 -M 15 -o seg_int_l.segbits $(addsuffix /segdata_clbl[lm]_l_[0-9][0-9][0-9].txt,$(SPECIMENS)) + ${XRAY_SEGMATCH} -m 5 -M 15 -o seg_int_r.segbits $(addsuffix /segdata_clbl[lm]_r_[0-9][0-9][0-9].txt,$(SPECIMENS)) + grep -f pattern_l.txt seg_int_l.segbits > filtered_seg_int_l.segbits + grep -f pattern_l.txt seg_int_r.segbits > filtered_seg_int_r.segbits + +pushdb: + ${XRAY_MERGEDB} int_l filtered_seg_int_l.segbits + ${XRAY_MERGEDB} int_r filtered_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 -n 50 > todo.txt + +clean: + 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/051-intpips2/generate.py b/fuzzers/051-intpips2/generate.py new file mode 100644 index 00000000..7772da8f --- /dev/null +++ b/fuzzers/051-intpips2/generate.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 + +import sys, re + +sys.path.append("../../../utils/") +from segmaker import segmaker + +pipdata = dict() +ignpip = set() + +def handle_design(prefix, second_pass): + segmk = segmaker(prefix + ".bits") + + tiledata = dict() + nlines = 0 + + print("Loading tags from design.txt.") + with open(prefix + ".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 \ + re.match(r"^(L[HV]B?)(_L)?(_B)?[0-9]", src) or \ + re.match(r"^(L[HV]B?)(_L)?(_B)?[0-9]", dst) or \ + re.match(r"^(CTRL|GFAN)(_L)?[0-9]", dst): + ignpip.add(pip) + + nlines += 1 + + if nlines == 0: + return + + 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) + + if second_pass: + segmk.compile() + segmk.write(prefix[7:]) + +for arg in sys.argv[1:]: + prefix = arg[0:-4] + handle_design(prefix, False) + +for arg in sys.argv[1:]: + prefix = arg[0:-4] + handle_design(prefix, True) + diff --git a/fuzzers/051-intpips2/generate.sh b/fuzzers/051-intpips2/generate.sh new file mode 100644 index 00000000..be91b5ef --- /dev/null +++ b/fuzzers/051-intpips2/generate.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +source ${XRAY_GENHEADER} + +vivado -mode batch -source ../generate.tcl + +for x in design_[0-9][0-9][0-9].bit; do + ${XRAY_BITREAD} -F $XRAY_ROI_FRAMES -o ${x}s -z -y $x +done + +python3 ../generate.py design_[0-9][0-9][0-9].bit + diff --git a/fuzzers/051-intpips2/generate.tcl b/fuzzers/051-intpips2/generate.tcl new file mode 100644 index 00000000..c21523c1 --- /dev/null +++ b/fuzzers/051-intpips2/generate.tcl @@ -0,0 +1,85 @@ +if 0 { +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] + +set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets o_OBUF] + +place_design +route_design + +write_checkpoint -force design.dcp +} + +source ../../../utils/utils.tcl + +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 +} + +set int_l_tiles [filter [pblock_tiles roi] {TYPE == INT_L}] +set int_r_tiles [filter [pblock_tiles roi] {TYPE == INT_R}] + +set fp [open "../todo.txt" r] +set todo_lines {} +for {gets $fp line} {$line != ""} {gets $fp line} { + lappend todo_lines $line +} +close $fp + +for {set i 100} {$i < 120} {incr i} { + set route_nodes {} + foreach line [randsample_list 5 $todo_lines] { + set line [split $line .] + set tile_type [lindex $line 0] + set dst_wire [lindex $line 1] + set src_wire [lindex $line 2] + + set tile "" + if {$tile_type == "INT_L"} { + set j [expr {int(rand()*[llength $int_l_tiles])}] + set tile [lindex $int_l_tiles $j] + } + if {$tile_type == "INT_R"} { + set j [expr {int(rand()*[llength $int_r_tiles])}] + set tile [lindex $int_r_tiles $j] + } + + lappend route_nodes $tile/$src_wire + lappend route_nodes $tile/$dst_wire + } + + set_property FIXED_ROUTE {} [get_nets o_OBUF] + route_design -unroute -net [get_nets o_OBUF] + route_via o_OBUF $route_nodes + + write_bitstream -quiet -force design_$i.bit + write_txtdata design_$i.txt +} + diff --git a/fuzzers/051-intpips2/maketodo.py b/fuzzers/051-intpips2/maketodo.py new file mode 100644 index 00000000..5f021500 --- /dev/null +++ b/fuzzers/051-intpips2/maketodo.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 + +import os, re + +def maketodo(pipfile, dbfile): + todos = set() + with open(pipfile, "r") as f: + for line in f: + todos.add(line.split()[0]) + with open(dbfile, "r") as f: + for line in f: + todos.remove(line.split()[0]) + for line in todos: + if line.endswith(".VCC_WIRE"): + continue + if line.endswith(".GND_WIRE"): + continue + if ".CTRL" in line: + continue + 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/051-intpips2/piplist.tcl b/fuzzers/051-intpips2/piplist.tcl new file mode 100644 index 00000000..98a590a6 --- /dev/null +++ b/fuzzers/051-intpips2/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/051-intpips2/top.v b/fuzzers/051-intpips2/top.v new file mode 100644 index 00000000..c0e91c58 --- /dev/null +++ b/fuzzers/051-intpips2/top.v @@ -0,0 +1,3 @@ +module top (input i, output o); + assign o = i; +endmodule diff --git a/utils/utils.tcl b/utils/utils.tcl index d0f80a1e..c7f5b5d9 100644 --- a/utils/utils.tcl +++ b/utils/utils.tcl @@ -20,7 +20,7 @@ proc route_via {net nodes} { } } - set_property FIXED_ROUTE $fixed_route $net + set_property -quiet FIXED_ROUTE $fixed_route $net puts "" }