mirror of https://github.com/openXC7/prjxray.git
Port 100-dsp-mskpat to top.py structure.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
This commit is contained in:
parent
44ce9a46e8
commit
3c211aa462
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
module top (input i, output o);
|
||||
assign o = i;
|
||||
endmodule
|
||||
Loading…
Reference in New Issue