|  | /* | 
|  | IOBUF | 
|  | Not a primitive? | 
|  | Looks like it has an OBUFT | 
|  |  | 
|  |  | 
|  | Output buffer family: | 
|  | OBUF | 
|  | OBUFDS | 
|  | OBUFT | 
|  | OBUFTDS | 
|  | */ | 
|  |  | 
|  | `ifndef ROI | 
|  | ERROR: must set ROI | 
|  | `endif | 
|  |  | 
|  | module top(input clk, stb, di, output do); | 
|  | localparam integer DIN_N = 256; | 
|  | localparam integer DOUT_N = 256; | 
|  |  | 
|  | reg [DIN_N-1:0] din; | 
|  | wire [DOUT_N-1:0] dout; | 
|  |  | 
|  | reg [DIN_N-1:0] din_shr; | 
|  | reg [DOUT_N-1:0] dout_shr; | 
|  |  | 
|  | always @(posedge clk) begin | 
|  | din_shr <= {din_shr, di}; | 
|  | dout_shr <= {dout_shr, din_shr[DIN_N-1]}; | 
|  | if (stb) begin | 
|  | din <= din_shr; | 
|  | dout_shr <= dout; | 
|  | end | 
|  | end | 
|  |  | 
|  | assign do = dout_shr[DOUT_N-1]; | 
|  |  | 
|  | `ROI | 
|  | roi ( | 
|  | .clk(clk), | 
|  | .din(din), | 
|  | .dout(dout) | 
|  | ); | 
|  | endmodule | 
|  |  | 
|  | module roi_io_a(input clk, input [255:0] din, output [255:0] dout); | 
|  | assign dout[0] = din[0] & din[1]; | 
|  |  | 
|  | IOBUF_INTERMDISABLE #( | 
|  | .DRIVE(12), | 
|  | .IBUF_LOW_PWR("TRUE"), | 
|  | .IOSTANDARD("DEFAULT"), | 
|  | .SLEW("SLOW"), | 
|  | .USE_IBUFDISABLE("TRUE") | 
|  | ) IOBUF_INTERMDISABLE_inst ( | 
|  | .O(1'b0), | 
|  | .IO(1'bz), | 
|  | .I(dout[8]), | 
|  | .IBUFDISABLE(1'b0), | 
|  | .INTERMDISABLE(1'b0), | 
|  | .T(1'b1)); | 
|  |  | 
|  | endmodule | 
|  |  | 
|  | module roi_io_b(input clk, input [255:0] din, output [255:0] dout); | 
|  | assign dout[0] = din[0] & din[1]; | 
|  |  | 
|  | wire onet; | 
|  |  | 
|  | IOBUF_INTERMDISABLE #( | 
|  | .DRIVE(12), | 
|  | .IBUF_LOW_PWR("FALSE"), | 
|  | .IOSTANDARD("DEFAULT"), | 
|  | .SLEW("SLOW"), | 
|  | .USE_IBUFDISABLE("FALSE") | 
|  | ) IOBUF_INTERMDISABLE_inst ( | 
|  | .O(onet), | 
|  | .IO(1'bz), | 
|  | .I(dout[8]), | 
|  | .IBUFDISABLE(1'b0), | 
|  | .INTERMDISABLE(1'b0), | 
|  | .T(1'b1)); | 
|  |  | 
|  | PULLUP PULLUP_inst ( | 
|  | .O(onet) | 
|  | ); | 
|  |  | 
|  | IOBUF_INTERMDISABLE #( | 
|  | .DRIVE(12), | 
|  | .IBUF_LOW_PWR("FALSE"), | 
|  | .IOSTANDARD("DEFAULT"), | 
|  | .SLEW("SLOW"), | 
|  | .USE_IBUFDISABLE("FALSE") | 
|  | ) i2 ( | 
|  | .O(), | 
|  | .IO(1'bz), | 
|  | .I(dout[8]), | 
|  | .IBUFDISABLE(1'b0), | 
|  | .INTERMDISABLE(1'b0), | 
|  | .T(1'b1)); | 
|  |  | 
|  | endmodule | 
|  |  | 
|  | /* | 
|  | For some reason this doesn't diff | 
|  | Was this optimized out? | 
|  |  | 
|  | ERROR: [Place 30-69] Instance roi/dut/OBUFT (OBUFT) is unplaced after IO placer | 
|  | ERROR: [Place 30-68] Instance roi/dut/OBUFT (OBUFT) is not placed | 
|  | */ | 
|  |  | 
|  | /* | 
|  | module roi_prop_a(input clk, input [255:0] din, output [255:0] dout); | 
|  | assign dout[0] = din[0] & din[1]; | 
|  |  | 
|  | //(* LOC="D19", KEEP, DONT_TOUCH *) | 
|  | (* KEEP, DONT_TOUCH *) | 
|  | IOBUF #( | 
|  | .DRIVE(8), | 
|  | .IBUF_LOW_PWR("TRUE"), | 
|  | .IOSTANDARD("DEFAULT"), | 
|  | .SLEW("SLOW") | 
|  | ) dut ( | 
|  | .O(dout[1]), | 
|  | .I(din[0]), | 
|  | .T(din[1])); | 
|  | endmodule | 
|  |  | 
|  | module roi_prop_b(input clk, input [255:0] din, output [255:0] dout); | 
|  | assign dout[0] = din[0] & din[1]; | 
|  |  | 
|  | //(* LOC="D19", KEEP, DONT_TOUCH *) | 
|  | (* KEEP, DONT_TOUCH *) | 
|  | IOBUF #( | 
|  | .DRIVE(12), | 
|  | .IBUF_LOW_PWR("TRUE"), | 
|  | .IOSTANDARD("DEFAULT"), | 
|  | .SLEW("SLOW") | 
|  | ) dut ( | 
|  | .O(dout[1]), | 
|  | .I(din[0]), | 
|  | .T(din[1])); | 
|  | endmodule | 
|  | */ | 
|  |  | 
|  | /* | 
|  | ERROR: [DRC REQP-1581] obuf_loaded: OBUFT roi/dut pin O drives one or more invalid loads. The loads are: dout_shr[1]_i_1 | 
|  | ERROR: [Place 30-69] Instance roi/dut (OBUFT) is unplaced after IO placer | 
|  | hmm | 
|  | Abandoning verilog approach | 
|  | tcl seems to work well, just use it directly | 
|  | */ | 
|  | module roi_prop_a(input clk, input [255:0] din, output [255:0] dout); | 
|  | (* LOC="D19", KEEP, DONT_TOUCH *) | 
|  | //(* KEEP, DONT_TOUCH *) | 
|  | OBUFT #( | 
|  | .DRIVE(8), | 
|  | .IOSTANDARD("DEFAULT"), | 
|  | .SLEW("SLOW") | 
|  | ) dut ( | 
|  | //.O(dout[1]), | 
|  | .O(), | 
|  | .I(din[0]), | 
|  | .T(din[1])); | 
|  | endmodule | 
|  |  | 
|  | module roi_prop_b(input clk, input [255:0] din, output [255:0] dout); | 
|  | (* LOC="D19", KEEP, DONT_TOUCH *) | 
|  | //(* KEEP, DONT_TOUCH *) | 
|  | (* KEEP, DONT_TOUCH *) | 
|  | OBUFT #( | 
|  | .DRIVE(12), | 
|  | .IOSTANDARD("DEFAULT"), | 
|  | .SLEW("SLOW") | 
|  | ) dut ( | 
|  | //.O(dout[1]), | 
|  | .O(), | 
|  | .I(din[0]), | 
|  | .T(din[1])); | 
|  | endmodule | 
|  |  | 
|  |  |