add tristate buffer and test
authorPepijn de Vos <pepijndevos@gmail.com>
Mon, 28 Oct 2019 14:18:01 +0000 (15:18 +0100)
committerPepijn de Vos <pepijndevos@gmail.com>
Mon, 28 Oct 2019 14:18:01 +0000 (15:18 +0100)
techlibs/gowin/cells_sim.v
techlibs/gowin/synth_gowin.cc
tests/arch/gowin/tribuf.ys [new file with mode: 0644]

index 0fe2c8c524aa844c0592b8a90e9c1efb57ba0afb..cc1ac48e692c0cf83e8397d644dc9a9fd15fbb93 100644 (file)
@@ -302,6 +302,12 @@ module OBUF(output O, input I);
        assign O = I;
 endmodule
 
+module TBUF (O, I, OEN);
+  input I, OEN;
+  output O;
+  assign O = OEN ? I : 1'bz;
+endmodule
+
 module GSR (input GSRI);
        wire GSRO = GSRI;
 endmodule
index e9b2ccded72cdc956bc70242cd9af43000718179..d541edd8423735a62b7d3ab35f8e25d41a7c2377 100644 (file)
@@ -174,7 +174,7 @@ struct SynthGowinPass : public ScriptPass
                        run("synth -run coarse");
                }
                
-                if (!nobram && check_label("bram", "(skip if -nobram)"))
+               if (!nobram && check_label("bram", "(skip if -nobram)"))
                {
                        run("memory_bram -rules +/gowin/bram.txt");
                        run("techmap -map +/gowin/brams_map.v -map +/gowin/cells_sim.v");
@@ -230,7 +230,7 @@ struct SynthGowinPass : public ScriptPass
                        run("techmap -map +/gowin/cells_map.v");
                        run("setundef -undriven -params -zero");
                        run("hilomap -singleton -hicell VCC V -locell GND G");
-                       run("iopadmap -bits -inpad IBUF O:I -outpad OBUF I:O", "(unless -noiopads)");
+                       run("iopadmap -bits -inpad IBUF O:I -outpad OBUF I:O, -toutpad TBUF OEN:I:O", "(unless -noiopads)");
                        run("dffinit  -ff DFF Q INIT");
                        run("clean");
 
diff --git a/tests/arch/gowin/tribuf.ys b/tests/arch/gowin/tribuf.ys
new file mode 100644 (file)
index 0000000..5855b9d
--- /dev/null
@@ -0,0 +1,13 @@
+read_verilog ../common/tribuf.v
+hierarchy -top tristate
+proc
+tribuf
+flatten
+synth
+equiv_opt -assert -map +/gowin/cells_sim.v -map +/simcells.v synth_gowin # equivalency check
+design -load postopt # load the post-opt design (otherwise equiv_opt loads the pre-opt design)
+cd tristate # Constrain all select calls below inside the top module
+#Internal cell type used. Need support it.
+select -assert-count 1 t:TBUF
+select -assert-count 2 t:IBUF
+select -assert-none t:TBUF t:IBUF %% t:* %D