mirror of https://github.com/openXC7/prjxray.git
Add intpips experiment
Signed-off-by: Clifford Wolf <clifford@clifford.at> Signed-off-by: Tim 'mithro' Ansell <mithro@mithis.com>
This commit is contained in:
parent
661a6c93f3
commit
cbad47ffad
|
|
@ -0,0 +1,8 @@
|
|||
|
||||
Experiment looking into the CLB PIPs
|
||||
====================================
|
||||
|
||||
None of the CLB PIPs are "real". I.e. all those PIPs are in fact implemented
|
||||
using other resources. E.g. the PIPs that select which net is routed to which
|
||||
LUT input pin is implemented by permutating the LUT INIT bits accordingly.
|
||||
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
/specimen_[0-9][0-9][0-9]/
|
||||
/seg_clbl[lm].segbits
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
|
||||
N := 1
|
||||
SPECIMENS := $(addprefix specimen_,$(shell seq -f '%03.0f' $(N)))
|
||||
SPECIMENS_OK := $(addsuffix /OK,$(SPECIMENS))
|
||||
|
||||
database: database/clbll database/clblm
|
||||
|
||||
pushdb: pushdb/clbll pushdb/clblm
|
||||
|
||||
database/%: $(SPECIMENS_OK)
|
||||
../../tools/segmatch -o seg_$(notdir $@).segbits \
|
||||
$(addsuffix /segdata_$(notdir $@).txt,$(SPECIMENS))
|
||||
|
||||
pushdb/%:
|
||||
bash ../../utils/mergedb.sh seg_$(notdir $@).segbits \
|
||||
../../database/$(XRAY_DATABASE)/seg_$(notdir $@).segbits
|
||||
|
||||
$(SPECIMENS_OK):
|
||||
bash generate.sh $(subst /OK,,$@)
|
||||
touch $@
|
||||
|
||||
clean:
|
||||
rm -rf specimen_[0-9][0-9][0-9]/ seg_clbll.segbits seg_clblm.segbits
|
||||
|
||||
.PHONY: database pushdb clean
|
||||
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
|
||||
Experiment looking into the INT PIPs
|
||||
====================================
|
||||
|
||||
Results: ???
|
||||
|
||||
|
|
@ -0,0 +1,52 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys, re
|
||||
|
||||
sys.path.append("../../../utils/")
|
||||
from segmaker import segmaker
|
||||
|
||||
segmk = segmaker("design.bits")
|
||||
|
||||
tiledata = dict()
|
||||
pipdata = dict()
|
||||
|
||||
print("Loading tags from design.txt.")
|
||||
with open("design.txt", "r") as f:
|
||||
for line in f:
|
||||
tile, pip, src, dst = line.split()
|
||||
_, pip = pip.split(".")
|
||||
_, src = src.split("/")
|
||||
_, dst = dst.split("/")
|
||||
|
||||
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)
|
||||
|
||||
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():
|
||||
if pip in pips:
|
||||
segmk.addtag(tile, pip, 1)
|
||||
else:
|
||||
src, dst = src_dst
|
||||
if (src not in srcs) and (dst not in dsts):
|
||||
segmk.addtag(tile, pip, 0)
|
||||
|
||||
segmk.compile()
|
||||
segmk.write()
|
||||
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
#!/bin/bash
|
||||
|
||||
. ../../utils/genheader.sh
|
||||
|
||||
echo '`define SEED 32'"'h$(echo $1 | md5sum | cut -c1-8)" > setseed.vh
|
||||
|
||||
vivado -mode batch -source ../generate.tcl
|
||||
|
||||
../../../tools/bitread -F $XRAY_ROI_FRAMES -o design.bits -zy design.bit
|
||||
python3 ../generate.py
|
||||
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
create_project -force -part $::env(XRAY_PART) design design
|
||||
|
||||
read_verilog ../top.v
|
||||
read_verilog ../picorv32.v
|
||||
synth_design -top top
|
||||
|
||||
set_property -dict "PACKAGE_PIN $::env(XRAY_PIN_00) IOSTANDARD LVCMOS33" [get_ports clk]
|
||||
set_property -dict "PACKAGE_PIN $::env(XRAY_PIN_01) IOSTANDARD LVCMOS33" [get_ports din]
|
||||
set_property -dict "PACKAGE_PIN $::env(XRAY_PIN_02) IOSTANDARD LVCMOS33" [get_ports dout]
|
||||
set_property -dict "PACKAGE_PIN $::env(XRAY_PIN_03) IOSTANDARD LVCMOS33" [get_ports stb]
|
||||
|
||||
create_pblock roi
|
||||
add_cells_to_pblock [get_pblocks roi] [get_cells 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 clk_IBUF]
|
||||
|
||||
place_design
|
||||
route_design
|
||||
|
||||
write_checkpoint -force design.dcp
|
||||
|
||||
proc write_txtdata {filename} {
|
||||
puts "Writing $filename."
|
||||
set fp [open $filename w]
|
||||
foreach tile [get_tiles [regsub -all {CLBL[LM]} [get_tiles -of_objects [get_sites -of_objects [get_pblocks roi]]] INT]] {
|
||||
puts "Dumping pips from tile $tile"
|
||||
foreach pip [get_pips -of_objects $tile] {
|
||||
if {[get_nets -quiet -of_objects $pip] != {}} {
|
||||
set src_wire [get_wires -uphill -of_objects $pip]
|
||||
set dst_wire [get_wires -downhill -of_objects $pip]
|
||||
puts $fp "$tile $pip $src_wire $dst_wire"
|
||||
}
|
||||
}
|
||||
}
|
||||
close $fp
|
||||
}
|
||||
|
||||
write_bitstream -force design.bit
|
||||
write_txtdata design.txt
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,91 @@
|
|||
`include "setseed.vh"
|
||||
|
||||
module top(input clk, din, stb, output dout);
|
||||
reg [41:0] din_bits;
|
||||
wire [78:0] dout_bits;
|
||||
|
||||
reg [41:0] din_shr;
|
||||
reg [78:0] dout_shr;
|
||||
|
||||
always @(posedge clk) begin
|
||||
if (stb) begin
|
||||
din_bits <= din_shr;
|
||||
dout_shr <= dout_bits;
|
||||
end else begin
|
||||
din_shr <= {din_shr, din};
|
||||
dout_shr <= {dout_shr, din_shr[41]};
|
||||
end
|
||||
end
|
||||
|
||||
assign dout = dout_shr[78];
|
||||
|
||||
roi roi (
|
||||
.clk(clk),
|
||||
.din_bits(din_bits),
|
||||
.dout_bits(dout_bits)
|
||||
);
|
||||
endmodule
|
||||
|
||||
module roi(input clk, input [41:0] din_bits, output [78:0] dout_bits);
|
||||
picorv32 picorv32 (
|
||||
.clk(clk),
|
||||
.resetn(din_bits[0]),
|
||||
.mem_valid(dout_bits[0]),
|
||||
.mem_instr(dout_bits[1]),
|
||||
.mem_ready(din_bits[1]),
|
||||
.mem_addr(dout_bits[33:2]),
|
||||
.mem_wdata(dout_bits[66:34]),
|
||||
.mem_wstrb(dout_bits[70:67]),
|
||||
.mem_rdata(din_bits[33:2])
|
||||
);
|
||||
|
||||
randluts randluts (
|
||||
.din(din_bits[41:34]),
|
||||
.dout(dout_bits[78:71])
|
||||
);
|
||||
endmodule
|
||||
|
||||
module randluts(input [7:0] din, output [7:0] dout);
|
||||
localparam integer N = 250;
|
||||
|
||||
function [31:0] xorshift32(input [31:0] xorin);
|
||||
begin
|
||||
xorshift32 = xorin;
|
||||
xorshift32 = xorshift32 ^ (xorshift32 << 13);
|
||||
xorshift32 = xorshift32 ^ (xorshift32 >> 17);
|
||||
xorshift32 = xorshift32 ^ (xorshift32 << 5);
|
||||
end
|
||||
endfunction
|
||||
|
||||
function [63:0] lutinit(input [7:0] a, b);
|
||||
begin
|
||||
lutinit[63:32] = xorshift32(xorshift32(xorshift32(xorshift32({a, b} ^ `SEED))));
|
||||
lutinit[31: 0] = xorshift32(xorshift32(xorshift32(xorshift32({b, a} ^ `SEED))));
|
||||
end
|
||||
endfunction
|
||||
|
||||
wire [(N+1)*8-1:0] nets;
|
||||
|
||||
assign nets[7:0] = din;
|
||||
assign dout = nets[(N+1)*8-1:N*8];
|
||||
|
||||
genvar i, j;
|
||||
generate
|
||||
for (i = 0; i < N; i = i+1) begin:is
|
||||
for (j = 0; j < 8; j = j+1) begin:js
|
||||
localparam integer k = xorshift32(xorshift32(xorshift32(xorshift32((i << 20) ^ (j << 10) ^ `SEED)))) & 255;
|
||||
LUT6 #(
|
||||
.INIT(lutinit(i, j))
|
||||
) lut (
|
||||
.I0(nets[8*i+(k+0)%8]),
|
||||
.I1(nets[8*i+(k+1)%8]),
|
||||
.I2(nets[8*i+(k+2)%8]),
|
||||
.I3(nets[8*i+(k+3)%8]),
|
||||
.I4(nets[8*i+(k+4)%8]),
|
||||
.I5(nets[8*i+(k+5)%8]),
|
||||
.O(nets[8*i+8+j])
|
||||
);
|
||||
end
|
||||
end
|
||||
endgenerate
|
||||
endmodule
|
||||
Loading…
Reference in New Issue