diff --git a/fuzzers/100-dsp-mskpat/Makefile b/fuzzers/100-dsp-mskpat/Makefile index 18e10f77..fbd211b9 100644 --- a/fuzzers/100-dsp-mskpat/Makefile +++ b/fuzzers/100-dsp-mskpat/Makefile @@ -1,33 +1,31 @@ +N ?= 8 -N := 1 -SPECIMENS := $(addprefix build/specimen_,$(shell seq -f '%03.0f' $(N))) -SPECIMENS_OK := $(addsuffix /OK,$(SPECIMENS)) +include ../fuzzer.mk -database: $(SPECIMENS_OK) - ${XRAY_SEGMATCH} -o build/segbits_dsp_l.db $(addsuffix /segdata_dsp_l_*.txt,$(SPECIMENS)) - ${XRAY_SEGMATCH} -o build/segbits_dsp_r.db $(addsuffix /segdata_dsp_r_*.txt,$(SPECIMENS)) - ${XRAY_DBFIXUP} --db-root build --clb-int - ${XRAY_MASKMERGE} build/mask_dsp_l.db $(addsuffix /segdata_dsp_l_*.txt,$(SPECIMENS)) - ${XRAY_MASKMERGE} build/mask_dsp_r.db $(addsuffix /segdata_dsp_r_*.txt,$(SPECIMENS)) +database: build/segbits_dsp_l.db build/mask_dsp_r.db build/segbits_dsp_r.db build/mask_dsp_r.db -pushdb: +SEGDATAS_L=$(addsuffix /segdata_dsp_l.txt,$(SPECIMENS)) +SEGDATAS_R=$(addsuffix /segdata_dsp_r.txt,$(SPECIMENS)) + +build/segbits_dsp_l.rdb: $(SPECIMENS_OK) + ${XRAY_SEGMATCH} -o build/segbits_dsp_l.rdb $(SEGDATAS_L) + +build/segbits_dsp_l.db build/mask_dsp_l.db: build/segbits_dsp_l.rdb + ${XRAY_DBFIXUP} --db-root build --zero-db bits.dbf --seg-fn-in $^ --seg-fn-out $@ + ${XRAY_MASKMERGE} build/mask_dsp_l.db $(SEGDATAS_L) + +build/segbits_dsp_r.rdb: $(SPECIMENS_OK) + ${XRAY_SEGMATCH} -o build/segbits_dsp_r.rdb $(SEGDATAS_R) + +build/segbits_dsp_r.db build/mask_dsp_r.db: build/segbits_dsp_r.rdb + ${XRAY_DBFIXUP} --db-root build --zero-db bits.dbf --seg-fn-in $^ --seg-fn-out $@ + ${XRAY_MASKMERGE} build/mask_dsp_r.db $(SEGDATAS_R) + +pushdb: database ${XRAY_MERGEDB} dsp_l build/segbits_dsp_l.db ${XRAY_MERGEDB} dsp_r build/segbits_dsp_r.db ${XRAY_MERGEDB} mask_dsp_l build/segbits_dsp_l.db ${XRAY_MERGEDB} mask_dsp_r build/segbits_dsp_r.db -$(SPECIMENS_OK): - bash generate.sh $(subst /OK,,$@) - touch $@ - -run: - $(MAKE) clean - $(MAKE) database - $(MAKE) pushdb - touch run.ok - -clean: - rm -rf build run.ok - -.PHONY: database pushdb run clean +.PHONY: database pushdb diff --git a/fuzzers/100-dsp-mskpat/bits.dbf b/fuzzers/100-dsp-mskpat/bits.dbf new file mode 100644 index 00000000..e69de29b diff --git a/fuzzers/100-dsp-mskpat/generate.py b/fuzzers/100-dsp-mskpat/generate.py index c1b2accc..5c76d66d 100644 --- a/fuzzers/100-dsp-mskpat/generate.py +++ b/fuzzers/100-dsp-mskpat/generate.py @@ -1,27 +1,22 @@ #!/usr/bin/env python3 -import sys - from prjxray.segmaker import Segmaker +import csv -segmk = Segmaker("design_%s.bits" % sys.argv[1]) +segmk = Segmaker("design.bits", verbose=True) -pipdata = dict() -ignpip = set() +print("Loading tags") +with open('params.csv', 'r') as f: + for d in csv.DictReader(f): + dsp = "DSP_0" if d['site'][-1] in "02468" else "DSP_1" -print("Loading tags from design.txt.") -with open("design_%s.txt" % sys.argv[1], "r") as f: - for line in f: - tile, loc, mask, pattern = line.split() - dsp = "DSP_0" if loc[-1] in "02468" else "DSP_1" - - mask = int(mask.replace("48'h", ""), 16) - pattern = int(pattern.replace("48'h", ""), 16) + mask = int(d['mask']) + pattern = int(d['pattern']) for i in range(48): - segmk.add_tile_tag(tile, "%s.MASK[%d]" % (dsp, i), (mask >> i) & 1) - segmk.add_tile_tag( - tile, "%s.PATTERN[%d]" % (dsp, i), (pattern >> i) & 1) + segmk.add_site_tag(d['site'], "%s.MASK[%d]" % (dsp, i), (mask >> i) & 1) + segmk.add_site_tag( + d['site'], "%s.PATTERN[%d]" % (dsp, i), (pattern >> i) & 1) segmk.compile() -segmk.write(suffix=sys.argv[1]) +segmk.write() diff --git a/fuzzers/100-dsp-mskpat/generate.sh b/fuzzers/100-dsp-mskpat/generate.sh deleted file mode 100644 index 1d101ea4..00000000 --- a/fuzzers/100-dsp-mskpat/generate.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -set -ex - -source ${XRAY_GENHEADER} - -${XRAY_VIVADO} -mode batch -source $FUZDIR/generate.tcl - -for i in {10..29}; do - ${XRAY_BITREAD} -F $XRAY_ROI_FRAMES -o design_${i}.bits -z -y design_${i}.bit - python3 $FUZDIR/generate.py $i -done - diff --git a/fuzzers/100-dsp-mskpat/generate.tcl b/fuzzers/100-dsp-mskpat/generate.tcl index b4321e0b..9e8cab8a 100644 --- a/fuzzers/100-dsp-mskpat/generate.tcl +++ b/fuzzers/100-dsp-mskpat/generate.tcl @@ -1,71 +1,19 @@ source "$::env(XRAY_DIR)/utils/utils.tcl" -create_project -force -part $::env(XRAY_PART) design design +proc run {} { + create_project -force -part $::env(XRAY_PART) design design + read_verilog top.v + synth_design -top top -read_verilog "$::env(FUZDIR)/top.v" -synth_design -top top + set_property CFGBVS VCCO [current_design] + set_property CONFIG_VOLTAGE 3.3 [current_design] + set_property BITSTREAM.GENERAL.PERFRAMECRC YES [current_design] -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] + place_design + route_design -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_param tcl.collectionResultDisplayLimit 0 - -place_design -route_design - -write_checkpoint -force design.dcp - -set cells [list] - -set gnd_net [create_net gnd_net] -set gnd_cell [create_cell -reference GND gnd_cell] -connect_net -net $gnd_net -objects [get_pins $gnd_cell/G] - -foreach site [get_sites -of_objects [filter [roi_tiles] -filter {TYPE == "DSP_L" || TYPE == "DSP_R"}] -filter {SITE_TYPE =~ DSP*}] { - set cell [create_cell -reference DSP48E1 ${site}_cell] - lappend cells $cell - set_property LOC $site $cell - foreach pin [get_pins -of_objects $cell -filter {DIRECTION == "IN"}] { - connect_net -net $gnd_net -objects $pin - } + write_checkpoint -force design.dcp + write_bitstream -force design.bit } -route_design - -proc write_txtdata {filename} { - upvar 1 cells cells - puts "Writing $filename." - set fp [open $filename w] - foreach cell $cells { - set loc [get_property LOC $cell] - set mask [get_property MASK $cell] - set pattern [get_property PATTERN $cell] - set tile [get_tiles -of_objects [get_sites -filter "NAME == $loc"]] - puts $fp "$tile $loc $mask $pattern" - } - close $fp -} - -proc randhex {len} { - set s "" - for {set i 0} {$i < $len} {incr i} { - set s "$s[format %x [expr {int(rand()*16)}]]" - } - return $s -} - -for {set i 10} {$i < 30} {incr i} { - foreach cell $cells { - set_property MASK "48'h[randhex 12]" $cell - set_property PATTERN "48'h[randhex 12]" $cell - } - write_checkpoint -force design_${i}.dcp - write_bitstream -force design_${i}.bit - write_txtdata design_${i}.txt -} +run diff --git a/fuzzers/100-dsp-mskpat/top.py b/fuzzers/100-dsp-mskpat/top.py new file mode 100644 index 00000000..cb1537fa --- /dev/null +++ b/fuzzers/100-dsp-mskpat/top.py @@ -0,0 +1,56 @@ +import os +import random +random.seed(int(os.getenv("SEED"), 16)) +from prjxray import util +from prjxray.db import Database + + +def gen_sites(): + db = Database(util.get_db_root()) + grid = db.grid() + for tile_name in sorted(grid.tiles()): + loc = grid.loc_of_tilename(tile_name) + gridinfo = grid.gridinfo_at_loc(loc) + if gridinfo.tile_type in ['DSP_L', 'DSP_R']: + for site in sorted(gridinfo.sites.keys()): + if gridinfo.sites[site] == 'DSP48E1': + yield tile_name, site + + +def write_params(lines): + pinstr = 'tile,site,mask,pattern\n' + for tile, site, mask, pattern in lines: + pinstr += '%s,%s,%s,%s\n' % (tile, site, mask, pattern) + + open('params.csv', 'w').write(pinstr) + + +def run(): + print(''' +module top(); + ''') + + lines = [] + + sites = list(gen_sites()) + for (tile_name, site_name) in sites: + mask = random.randint(0, 2**48-1) + pattern = random.randint(0, 2**48-1) + lines.append((tile_name, site_name, mask, pattern)) + + print( + ''' + (* KEEP, DONT_TOUCH, LOC = "{0}" *) + DSP48E1 #( + .MASK(48'h{1:x}), + .PATTERN(48'h{2:x}) + ) dsp_{0} ( + ); +'''.format(site_name, mask, pattern)) + + print("endmodule") + write_params(lines) + + +if __name__ == '__main__': + run() diff --git a/fuzzers/100-dsp-mskpat/top.v b/fuzzers/100-dsp-mskpat/top.v deleted file mode 100644 index c0e91c58..00000000 --- a/fuzzers/100-dsp-mskpat/top.v +++ /dev/null @@ -1,3 +0,0 @@ -module top (input i, output o); - assign o = i; -endmodule