Gowin: deal with active-low tristate (#2971)
authorPepijn de Vos <pepijndevos@gmail.com>
Fri, 20 Aug 2021 19:21:06 +0000 (21:21 +0200)
committerGitHub <noreply@github.com>
Fri, 20 Aug 2021 19:21:06 +0000 (21:21 +0200)
* deal with active-low tristate

* remove empty port

* update sim models

* add expected lut1 to tests

techlibs/gowin/cells_map.v
techlibs/gowin/cells_sim.v
techlibs/gowin/synth_gowin.cc
techlibs/nexus/cells_map.v
tests/arch/gowin/tribuf.ys

index 851ef20b262f85ddf19a8252a14b0c9b2e63b115..90eb9b5a435dcc8957fbaa5058f132bffce4e55a 100644 (file)
@@ -122,6 +122,13 @@ module     \$_DFFE_NP0P_ (input D, C, R, E, output Q);
        wire _TECHMAP_REMOVEINIT_Q_ = 1;
 endmodule
 
+module \$__GW_IOBUF (input I, OE, output O, inout IO);
+       IOBUF _TECHMAP_REPLACE_ (.I(I), .O(O), .OEN(~OE), .IO(IO));
+endmodule
+
+module \$__GW_TBUF (input I, OE, output O);
+       TBUF _TECHMAP_REPLACE_ (.I(I), .OEN(~OE), .O(O));
+endmodule
 
 module \$lut (A, Y);
        parameter WIDTH = 0;
index 509bf3ef293b979b672c414d97fa48792f522498..41398409d31c5157fa17ca1ba8e9b0972289a52b 100644 (file)
@@ -573,14 +573,14 @@ endmodule
 module TBUF (O, I, OEN);
   input I, OEN;
   output O;
-  assign O = OEN ? I : 1'bz;
+  assign O = OEN ? 1'bz : I;
 endmodule
 
 module IOBUF (O, IO, I, OEN);
   input I,OEN;
   output O;
   inout IO;
-  assign IO = OEN ? I : 1'bz;
+  assign IO = OEN ? 1'bz : I;
   assign I = IO;
 endmodule
 
index c97bd595ca7ee76382e9bef447f8051e866ff57b..087f6b8cf45839c73de9dc81f9db7ab10fb60356 100644 (file)
@@ -241,6 +241,9 @@ struct SynthGowinPass : public ScriptPass
                        if (retime || help_mode)
                                run("abc -dff -D 1", "(only if -retime)");
                        run("splitnets");
+                       if (!noiopads || help_mode)
+                               run("iopadmap -bits -inpad IBUF O:I -outpad OBUF I:O "
+                                       "-toutpad $__GW_TBUF OE:I:O -tinoutpad $__GW_IOBUF OE:O:I:IO", "(unless -noiopads)");
                }
 
                if (check_label("map_ffs"))
@@ -277,9 +280,6 @@ struct SynthGowinPass : public ScriptPass
                        run("opt_lut_ins -tech gowin");
                        run("setundef -undriven -params -zero");
                        run("hilomap -singleton -hicell VCC V -locell GND G");
-                       if (!noiopads || help_mode)
-                               run("iopadmap -bits -inpad IBUF O:I -outpad OBUF I:O "
-                                       "-toutpad TBUF OEN:I:O -tinoutpad IOBUF OEN:O:I:IO", "(unless -noiopads)");
                        run("clean");
                        run("autoname");
                }
index 86911d7a0f0b804dab511d7996225122db6416af..1e53e4026521e0e4478e90e67211741116417fb3 100644 (file)
@@ -58,7 +58,7 @@ module \$__NX_TINOUTPAD (input I, OE, output O, inout B);
 endmodule
 
 module \$__NX_TOUTPAD (input I, OE, output O);
-       OBZ _TECHMAP_REPLACE_ (.I(I), .O(), .T(~OE), .O(O));
+       OBZ _TECHMAP_REPLACE_ (.I(I), .T(~OE), .O(O));
 endmodule
 
 `ifndef NO_LUT
index 5855b9d975f0cf13efa6bcc6ade9713e3462ccf4..eef7e379ffd65e3079d164b857bfa3f9840e7348 100644 (file)
@@ -9,5 +9,6 @@ design -load postopt # load the post-opt design (otherwise equiv_opt loads the p
 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 1 t:LUT1
 select -assert-count 2 t:IBUF
-select -assert-none t:TBUF t:IBUF %% t:* %D
+select -assert-none t:TBUF t:IBUF t:LUT1 %% t:* %D
\ No newline at end of file