aboutsummaryrefslogtreecommitdiffstats
path: root/icefuzz/tests
diff options
context:
space:
mode:
authorSimon Schubert <2@0x2c.org>2019-02-20 11:06:01 +0100
committerSimon Schubert <2@0x2c.org>2019-02-22 22:35:55 +0100
commitd76ac32ec939e421190d8e41ee0ad5e5eacbddd5 (patch)
tree278fbc981bb8c34a70adcf96a15b67709118103a /icefuzz/tests
parentc0cbae88ab47a3879aacf80d53b6a85710682a6b (diff)
downloadicestorm-d76ac32ec939e421190d8e41ee0ad5e5eacbddd5.tar.gz
icestorm-d76ac32ec939e421190d8e41ee0ad5e5eacbddd5.tar.bz2
icestorm-d76ac32ec939e421190d8e41ee0ad5e5eacbddd5.zip
iCE40 Ultra = iCE5LP = u4k port
Diffstat (limited to 'icefuzz/tests')
-rwxr-xr-xicefuzz/tests/colbuf_io_u4k.sh47
-rwxr-xr-xicefuzz/tests/colbuf_logic_u4k.sh30
-rwxr-xr-xicefuzz/tests/colbuf_ram_u4k.sh56
-rwxr-xr-xicefuzz/tests/colbuf_u4k.sh51
-rw-r--r--icefuzz/tests/glb-u4k.sh85
-rw-r--r--icefuzz/tests/io_latched_u4k.sh27
-rwxr-xr-xicefuzz/tests/osc/osc.py75
7 files changed, 371 insertions, 0 deletions
diff --git a/icefuzz/tests/colbuf_io_u4k.sh b/icefuzz/tests/colbuf_io_u4k.sh
new file mode 100755
index 0000000..fe63b62
--- /dev/null
+++ b/icefuzz/tests/colbuf_io_u4k.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+
+set -ex
+
+mkdir -p colbuf_io_u4k.work
+cd colbuf_io_u4k.work
+
+glb_pins="20 35 37 44"
+
+pins="
+2 3 4 6 9 10 11 12
+ 13 18 19 20 21
+ 25 26 27 28 31 32 34 35 36
+ 37 38 42 43 44 45 46 47 48
+"
+pins="$( echo $pins )"
+
+for pin in $pins; do
+ pf="colbuf_io_u4k_$pin"
+ gpin=$( echo $glb_pins | tr ' ' '\n' | grep -v $pin | sort -R | head -n1; )
+ cat > ${pf}.v <<- EOT
+ module top (input clk, data, output pin);
+ wire gc;
+ SB_GB_IO #(
+ .PIN_TYPE(6'b 0000_00),
+ .PULLUP(1'b0),
+ .NEG_TRIGGER(1'b0),
+ .IO_STANDARD("SB_LVCMOS")
+ ) gbuf (
+ .PACKAGE_PIN(clk),
+ .GLOBAL_BUFFER_OUTPUT(gc)
+ );
+ SB_IO #(
+ .PIN_TYPE(6'b 0101_00)
+ ) pin_obuf (
+ .PACKAGE_PIN(pin),
+ .OUTPUT_CLK(gc),
+ .D_OUT_0(data)
+ );
+ endmodule
+ EOT
+ echo "set_io pin $pin" > ${pf}.pcf
+ echo "set_io clk $gpin" >> ${pf}.pcf
+ ICEDEV=u4k-sg48 bash ../../icecube.sh ${pf}.v > ${pf}.log 2>&1
+ ../../../icebox/icebox_explain.py ${pf}.asc > ${pf}.exp
+ rm -rf ${pf}.tmp
+done
diff --git a/icefuzz/tests/colbuf_logic_u4k.sh b/icefuzz/tests/colbuf_logic_u4k.sh
new file mode 100755
index 0000000..2eaaf75
--- /dev/null
+++ b/icefuzz/tests/colbuf_logic_u4k.sh
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+set -ex
+
+mkdir -p colbuf_logic_u4k.work
+cd colbuf_logic_u4k.work
+
+glb_pins="20 35 37 44"
+
+for x in {1..5} {7..18} {20..24}; do
+for y in {1..20}; do
+ pf="colbuf_logic_u4k_${x}_${y}"
+ [ -f ${pf}.exp ] && continue
+ gpin=$( echo $glb_pins | tr ' ' '\n' | sort -R | head -n1; )
+ cat > ${pf}.v <<- EOT
+ module top (input c, d, output q);
+ SB_DFF dff (
+ .C(c),
+ .D(d),
+ .Q(q)
+ );
+ endmodule
+ EOT
+ echo "set_location dff $x $y 0" > ${pf}.pcf
+ echo "set_io c $gpin" >> ${pf}.pcf
+ [ $x = 7 -a $y = 20 ] && continue
+ ICEDEV=u4k-sg48 bash ../../icecube.sh ${pf}.v > ${pf}.log 2>&1
+ ../../../icebox/icebox_explain.py ${pf}.asc > ${pf}.exp
+ rm -rf ${pf}.tmp
+done; done
diff --git a/icefuzz/tests/colbuf_ram_u4k.sh b/icefuzz/tests/colbuf_ram_u4k.sh
new file mode 100755
index 0000000..6391210
--- /dev/null
+++ b/icefuzz/tests/colbuf_ram_u4k.sh
@@ -0,0 +1,56 @@
+#!/bin/bash
+
+set -ex
+
+mkdir -p colbuf_ram_u4k.work
+cd colbuf_ram_u4k.work
+
+glb_pins="20 35 37 44"
+
+for x in 6 19; do
+for y in {1..30}; do
+ pf="colbuf_ram_u4k_${x}_${y}"
+ gpin=$( echo $glb_pins | tr ' ' '\n' | sort -R | head -n1; )
+ if [ $((y % 2)) == 1 ]; then
+ clkport="WCLK"
+ other_clkport="RCLK"
+ else
+ clkport="RCLK"
+ other_clkport="WCLK"
+ fi
+ cat > ${pf}.v <<- EOT
+ module top (input c, oc, input [1:0] d, output [1:0] q);
+ wire gc;
+ SB_GB_IO #(
+ .PIN_TYPE(6'b 0000_00),
+ .PULLUP(1'b0),
+ .NEG_TRIGGER(1'b0),
+ .IO_STANDARD("SB_LVCMOS")
+ ) gbuf (
+ .PACKAGE_PIN(c),
+ .GLOBAL_BUFFER_OUTPUT(gc)
+ );
+ SB_RAM40_4K #(
+ .READ_MODE(3),
+ .WRITE_MODE(3)
+ ) ram40 (
+ .WADDR(11'b0),
+ .RADDR(11'b0),
+ .$clkport(gc),
+ .$other_clkport(oc),
+ .RDATA(q),
+ .WDATA(d),
+ .WE(1'b1),
+ .WCLKE(1'b1),
+ .RE(1'b1),
+ .RCLKE(1'b1)
+ );
+ endmodule
+ EOT
+ echo "set_location ram40 $x $((y - (1 - y%2))) 0" > ${pf}.pcf
+ echo "set_io oc 1" >> ${pf}.pcf
+ echo "set_io c $gpin" >> ${pf}.pcf
+ ICEDEV=u4k-sg48 bash ../../icecube.sh ${pf}.v > ${pf}.log 2>&1
+ ../../../icebox/icebox_explain.py ${pf}.asc > ${pf}.exp
+ rm -rf ${pf}.tmp
+done; done
diff --git a/icefuzz/tests/colbuf_u4k.sh b/icefuzz/tests/colbuf_u4k.sh
new file mode 100755
index 0000000..60cf4a6
--- /dev/null
+++ b/icefuzz/tests/colbuf_u4k.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+
+for f in colbuf_io_u4k.work/*.exp colbuf_logic_u4k.work/*.exp colbuf_ram_u4k.work/*.exp; do
+ echo $f >&2
+ python3 colbuf.py $f
+done | sort -u > colbuf_u4k.txt
+
+get_colbuf_data()
+{
+ tr -d '(,)' < colbuf_u4k.txt
+ # for x in {0..2} {4..9} {11..13}; do
+ # echo $x 4 $x 0
+ # echo $x 5 $x 8
+ # echo $x 12 $x 9
+ # echo $x 13 $x 17
+ # done
+ # for x in 3 10; do
+ # echo $x 3 $x 0
+ # echo $x 3 $x 4
+ # echo $x 5 $x 8
+ # echo $x 11 $x 9
+ # echo $x 11 $x 12
+ # echo $x 13 $x 17
+ # done
+}
+
+{
+ echo "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1050\" width=\"1050\">"
+ for x in {1..33}; do
+ echo "<line x1=\"$((10+x*30))\" y1=\"10\" x2=\"$((10+x*30))\" y2=\"$((10+34*30))\" style=\"stroke:rgb(0,0,0);stroke-width:3\" />"
+ done
+ for y in {1..33}; do
+ echo "<line x1=\"10\" y1=\"$((10+y*30))\" x2=\"$((10+34*30))\" y2=\"$((10+y*30))\" style=\"stroke:rgb(0,0,0);stroke-width:3\" />"
+ done
+ for x in {0..33}; do
+ echo "<text x=\"$((10+$x*30+7))\" y=\"$((10+34*30+15))\" fill=\"black\">$x</text>"
+ done
+ for y in {0..33}; do
+ echo "<text x=\"$((10+34*30+5))\" y=\"$((10+(33-y)*30+20))\" fill=\"black\">$y</text>"
+ done
+ while read x1 y1 x2 y2; do
+ echo "<line x1=\"$((10+x1*30+15))\" y1=\"$((10+(33-y1)*30+15))\" x2=\"$((10+x2*30+15))\" y2=\"$((10+(33-y2)*30+15))\" style=\"stroke:rgb(255,0,0);stroke-width:5\" />"
+ done < <( get_colbuf_data; )
+ while read x1 y1 x2 y2; do
+ echo "<circle cx=\"$((10+x2*30+15))\" cy=\"$((10+(33-y2)*30+15))\" r=\"4\" fill=\"blue\" />"
+ done < <( get_colbuf_data; )
+ while read x1 y1 x2 y2; do
+ echo "<circle cx=\"$((10+x1*30+15))\" cy=\"$((10+(33-y1)*30+15))\" r=\"5\" fill=\"gray\" />"
+ done < <( get_colbuf_data; )
+ echo "</svg>"
+} > colbuf_u4k.svg
diff --git a/icefuzz/tests/glb-u4k.sh b/icefuzz/tests/glb-u4k.sh
new file mode 100644
index 0000000..bdc50f8
--- /dev/null
+++ b/icefuzz/tests/glb-u4k.sh
@@ -0,0 +1,85 @@
+#!/bin/bash
+
+set -ex
+
+mkdir -p glb_u4k.work
+cd glb_u4k.work
+
+glb_pins="20 35 37 44"
+
+for gpin in $glb_pins; do
+ pf="glb_u4k_pin_$gpin"
+ cat > ${pf}.v <<- EOT
+ module top (input clk, data, output pin);
+ wire gc;
+ SB_GB_IO #(
+ .PIN_TYPE(6'b 0000_00),
+ .PULLUP(1'b0),
+ .NEG_TRIGGER(1'b0),
+ .IO_STANDARD("SB_LVCMOS")
+ ) gbuf (
+ .PACKAGE_PIN(clk),
+ .GLOBAL_BUFFER_OUTPUT(gc)
+ );
+ SB_IO #(
+ .PIN_TYPE(6'b 0101_00)
+ ) pin_obuf (
+ .PACKAGE_PIN(pin),
+ .OUTPUT_CLK(gc),
+ .D_OUT_0(data)
+ );
+ endmodule
+ EOT
+ echo "set_io clk $gpin" > ${pf}.pcf
+ ICEDEV=u4k-sg48 bash ../../icecube.sh ${pf}.v > ${pf}.log 2>&1
+ ../../../icebox/icebox_explain.py ${pf}.asc > ${pf}.exp
+ rm -rf ${pf}.tmp
+done
+
+oscs="HF LF"
+
+for osc in $oscs; do
+ pf="glb_u4k_${osc}"
+ cat > ${pf}.v <<- EOT
+ module top (input data, output pin);
+ wire clk;
+ SB_${osc}OSC osc(
+ .CLK${osc}PU(1'b1),
+ .CLK${osc}EN(1'b1),
+ .CLK${osc}(clk)
+ );
+ SB_IO #(
+ .PIN_TYPE(6'b 0101_00)
+ ) pin_obuf (
+ .PACKAGE_PIN(pin),
+ .OUTPUT_CLK(clk),
+ .D_OUT_0(data)
+ );
+ endmodule
+ EOT
+ ICEDEV=u4k-sg48 bash ../../icecube.sh ${pf}.v > ${pf}.log 2>&1
+ ../../../icebox/icebox_explain.py ${pf}.asc > ${pf}.exp
+ rm -rf ${pf}.tmp
+done
+
+pf="glb_u4k_gbufin"
+cat > ${pf}.v <<- EOT
+ module top (input [7:0] clk, data, output [7:0] pin);
+ wire [7:0] gc;
+ SB_GB gbufin[7:0] (
+ .USER_SIGNAL_TO_GLOBAL_BUFFER(clk),
+ .GLOBAL_BUFFER_OUTPUT(gc)
+ );
+ SB_IO #(
+ .PIN_TYPE(6'b 0101_00)
+ ) pin_obuf[7:0] (
+ .PACKAGE_PIN(pin),
+ .OUTPUT_CLK(gc),
+ .D_OUT_0(data)
+ );
+ endmodule
+ EOT
+# echo "set_io clk 10" > ${pf}.pcf
+ICEDEV=u4k-sg48 bash ../../icecube.sh ${pf}.v > ${pf}.log 2>&1
+../../../icebox/icebox_explain.py ${pf}.asc > ${pf}.exp
+rm -rf ${pf}.tmp
diff --git a/icefuzz/tests/io_latched_u4k.sh b/icefuzz/tests/io_latched_u4k.sh
new file mode 100644
index 0000000..ca724fb
--- /dev/null
+++ b/icefuzz/tests/io_latched_u4k.sh
@@ -0,0 +1,27 @@
+#!/bin/bash
+
+set -ex
+
+mkdir -p io_latched_u4k.work
+cd io_latched_u4k.work
+
+pins="
+2 3 4 6 9 10 11 12
+13 18 19 20 21 23
+25 26 27 28 31 32 34 35 36
+37 38 42 43 44 45 46 47 48
+"
+pins="$( echo $pins )"
+
+for pin in $pins ; do
+ pf="io_latched_$pin"
+ cp ../io_latched.v ${pf}.v
+ read pin_latch pin_data < <( echo $pins | tr ' ' '\n' | grep -v $pin | sort -R; )
+ {
+ echo "set_io pin $pin"
+ echo "set_io latch_in $pin_latch"
+ echo "set_io data_out $pin_data"
+ } > ${pf}.pcf
+ ICEDEV=u4k-sg48 bash ../../icecube.sh ${pf}.v
+ ../../../icebox/icebox_vlog.py -SP ${pf}.psb ${pf}.asc > ${pf}.ve
+done
diff --git a/icefuzz/tests/osc/osc.py b/icefuzz/tests/osc/osc.py
new file mode 100755
index 0000000..231ce01
--- /dev/null
+++ b/icefuzz/tests/osc/osc.py
@@ -0,0 +1,75 @@
+#!/usr/bin/env python3
+
+import os, sys
+
+device = "u4k"
+
+if not os.path.exists("./work_osc"):
+ os.mkdir("./work_osc")
+
+def run(route_fabric):
+ name = "./work_osc/osc_cbit_fabric_%d" % route_fabric
+ with open(name+'.v',"w") as f:
+ print("""
+ module top(
+ input clkhfpu,
+ input clkhfen,
+ input clklfpu,
+ input clklfen,
+ output pin,
+ output pin2,
+ input data
+ );
+
+ wire clkhf;
+ SB_HFOSC #(
+ .CLKHF_DIV("%s")
+ ) hfosc (
+ .CLKHFPU(clkhfpu),
+ .CLKHFEN(clkhfen),
+ .CLKHF(clkhf)
+ ); /* synthesis ROUTE_THROUGH_FABRIC = %d */
+
+ SB_IO #(
+ .PIN_TYPE(6'b 0101_00)
+ ) pin_obuf (
+ .PACKAGE_PIN(pin),
+ .OUTPUT_CLK(clkhf),
+ .D_OUT_0(data)
+ );
+
+ wire clklf;
+ SB_LFOSC lfosc (
+ .CLKLFPU(clklfpu),
+ .CLKLFEN(clklfen),
+ .CLKLF(clklf)
+ ); /* synthesis ROUTE_THROUGH_FABRIC = %d */
+
+ SB_IO #(
+ .PIN_TYPE(6'b 0101_00)
+ ) pin2_obuf (
+ .PACKAGE_PIN(pin2),
+ .OUTPUT_CLK(clklf),
+ .D_OUT_0(data)
+ );
+
+ endmodule
+ """ % (
+ "0b11", route_fabric, route_fabric
+ ), file=f)
+
+ retval = os.system("bash ../../icecube.sh -" + device + " " + name+".v > ./work_osc/icecube.log 2>&1")
+ if retval != 0:
+ sys.stderr.write('ERROR: icecube returned non-zero error code\n')
+ sys.exit(1)
+ retval = os.system("../../../icebox/icebox_explain.py " + name+".asc > " + name+".exp")
+ if retval != 0:
+ sys.stderr.write('ERROR: icebox_explain returned non-zero error code\n')
+ sys.exit(1)
+ retval = os.system("../../../icebox/icebox_vlog.py " + name+".asc > " + name+".ve")
+ if retval != 0:
+ sys.stderr.write('ERROR: icebox_vlog returned non-zero error code\n')
+ sys.exit(1)
+
+run(0)
+run(1)