Port 100-dsp-mskpat to top.py structure.

Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
This commit is contained in:
Keith Rothman 2019-01-28 11:30:49 -08:00
parent 44ce9a46e8
commit 3c211aa462
7 changed files with 102 additions and 121 deletions

View File

@ -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

View File

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -1,3 +0,0 @@
module top (input i, output o);
assign o = i;
endmodule