Reworked the NO_SEQ attribute test/example Signed-off-by: Maciej Kurc <mkurc@antmicro.com>
diff --git a/tests/no_seq/README.rst b/tests/no_seq/README.rst index 0ed53ae..5866fc2 100644 --- a/tests/no_seq/README.rst +++ b/tests/no_seq/README.rst
@@ -1,28 +1,20 @@ Forced non-sequential relations to an input +++++++++++++++++++++++++++++++++++++++++++ -There are cases when a primitive needs to have different input/output port relations that it can be inferred from its internal behavioral model. This is due to the way that VPR requires primitives to be modelled. +This is a case when a macro block consisting of a LUT and an FF is to be modeled in VPR as a single primitive. The block has two outputs: the first one sources at the LUT directly and the second one passes through an external register: -V2X allows forcing certain inputs to have no sequential relations to any outputs. Such an input port need to be annotated using the `(* NO_SEQ *)` attribute. +.. image:: lut_ff_macro.svg -This example shows a LOGIC cell macro primitive that models a whole LOGIC cell of Quicklogic EOS S3 FPGA architecture. The primitive is defined according to `VTR documentation <https://docs.verilogtorouting.org/en/latest/tutorials/arch/timing_modeling/#sequential-block-with-internal-paths-and-combinational-input>`_. - -.. symbolator:: logic_macro.sim.v - -.. verilog-diagram:: logic_macro.sim.v - :type: netlistsvg - :module: LOGIC_MACRO - -.. no-license:: logic_macro.sim.v +.. no-license:: lut_ff_macro.sim.v :language: verilog - :caption: tests/no_seq/logic_macro.sim.v + :caption: tests/no_seq/lut_ff_macro.sim.v -Input ports annotated with the `(* NO_SEQ *)` attribute are combinationaly related to TZ and CZ outputs and sequentially related to the QZ output. According to the VPR documentation there should be no clock relation to them defined in the pb_type XML and this is what the `(* NO_SEQ *)` attribute ensures. +Since relation of LUT inputs is combinational for one output and sequential for another they have to be defined in a special way as required by VPR (see `VTR documentation <https://docs.verilogtorouting.org/en/latest/tutorials/arch/timing_modeling/#sequential-block-with-internal-paths-and-combinational-input>`_). Due to the presence of the output register all sequential annotations are moved to the output port. Hence LUT inputs must not mention any clock signal. This can be achieved in V2X by specifying the `(* NO_SEQ *)` attribute on them. The attribute prevents V2X from annotating input ports with any clock relations. -.. literalinclude:: logic_macro.model.xml +.. literalinclude:: lut_ff_macro.model.xml :language: xml - :caption: logic_macro.model.xml + :caption: lut_ff_macro.model.xml -.. literalinclude:: logic_macro.pb_type.xml +.. literalinclude:: lut_ff_macro.pb_type.xml :language: xml - :caption: logic_macro.pb_type.xml + :caption: lut_ff_macro.pb_type.xml
diff --git a/tests/no_seq/golden.model.xml b/tests/no_seq/golden.model.xml index b373b38..5a8e594 100644 --- a/tests/no_seq/golden.model.xml +++ b/tests/no_seq/golden.model.xml
@@ -1,34 +1,15 @@ <models xmlns:xi="http://www.w3.org/2001/XInclude"> - <model name="LOGIC_MACRO"> + <model name="LUT_FF_MACRO"> <input_ports> - <port combinational_sink_ports="QZ CZ" name="BA1"/> - <port combinational_sink_ports="QZ CZ" name="BA2"/> - <port combinational_sink_ports="QZ CZ" name="BAB"/> - <port combinational_sink_ports="QZ CZ" name="BB1"/> - <port combinational_sink_ports="QZ CZ" name="BB2"/> - <port combinational_sink_ports="QZ CZ" name="BSL"/> - <port combinational_sink_ports="FZ" name="F1"/> - <port combinational_sink_ports="FZ" name="F2"/> - <port combinational_sink_ports="FZ" name="FS"/> - <port is_clock="1" name="QCK"/> - <port clock="QCK" name="QDI"/> - <port clock="QCK" name="QDS"/> - <port clock="QCK" name="QEN"/> - <port clock="QCK" name="QRT"/> - <port clock="QCK" name="QST"/> - <port combinational_sink_ports="QZ CZ TZ" name="TA1"/> - <port combinational_sink_ports="QZ CZ TZ" name="TA2"/> - <port combinational_sink_ports="QZ CZ TZ" name="TAB"/> - <port combinational_sink_ports="QZ CZ TZ" name="TB1"/> - <port combinational_sink_ports="QZ CZ TZ" name="TB2"/> - <port combinational_sink_ports="QZ CZ" name="TBS"/> - <port combinational_sink_ports="QZ CZ TZ" name="TSL"/> + <port name="CLK" is_clock="1"/> + <port name="I0" combinational_sink_ports="QZ Z"/> + <port name="I1" combinational_sink_ports="QZ Z"/> + <port name="I2" combinational_sink_ports="QZ Z"/> + <port name="I3" combinational_sink_ports="QZ Z"/> </input_ports> <output_ports> - <port name="CZ"/> - <port name="FZ"/> - <port clock="QCK" name="QZ"/> - <port name="TZ"/> + <port name="QZ" clock="CLK"/> + <port name="Z"/> </output_ports> </model> </models>
diff --git a/tests/no_seq/golden.pb_type.xml b/tests/no_seq/golden.pb_type.xml index 98fc5ec..a21a18d 100644 --- a/tests/no_seq/golden.pb_type.xml +++ b/tests/no_seq/golden.pb_type.xml
@@ -1,76 +1,22 @@ <?xml version='1.0' encoding='utf-8'?> -<pb_type xmlns:xi="http://www.w3.org/2001/XInclude" name="LOGIC_MACRO" num_pb="1"> - <blif_model>.subckt LOGIC_MACRO</blif_model> - <clock name="QCK" num_pins="1"/> - <input name="BA1" num_pins="1"/> - <input name="BA2" num_pins="1"/> - <input name="BAB" num_pins="1"/> - <input name="BB1" num_pins="1"/> - <input name="BB2" num_pins="1"/> - <input name="BSL" num_pins="1"/> - <input name="F1" num_pins="1"/> - <input name="F2" num_pins="1"/> - <input name="FS" num_pins="1"/> - <input name="QDI" num_pins="1"/> - <input name="QDS" num_pins="1"/> - <input name="QEN" num_pins="1"/> - <input name="QRT" num_pins="1"/> - <input name="QST" num_pins="1"/> - <input name="TA1" num_pins="1"/> - <input name="TA2" num_pins="1"/> - <input name="TAB" num_pins="1"/> - <input name="TB1" num_pins="1"/> - <input name="TB2" num_pins="1"/> - <input name="TBS" num_pins="1"/> - <input name="TSL" num_pins="1"/> - <output name="CZ" num_pins="1"/> - <output name="FZ" num_pins="1"/> +<pb_type xmlns:xi="http://www.w3.org/2001/XInclude" num_pb="1" name="LUT_FF_MACRO"> + <blif_model>.subckt LUT_FF_MACRO</blif_model> + <clock name="CLK" num_pins="1"/> + <input name="I0" num_pins="1"/> + <input name="I1" num_pins="1"/> + <input name="I2" num_pins="1"/> + <input name="I3" num_pins="1"/> <output name="QZ" num_pins="1"/> - <output name="TZ" num_pins="1"/> - <delay_constant in_port="BA1" max="1e-10" out_port="CZ"/> - <delay_constant in_port="BA2" max="1e-10" out_port="CZ"/> - <delay_constant in_port="BAB" max="1e-10" out_port="CZ"/> - <delay_constant in_port="BB1" max="1e-10" out_port="CZ"/> - <delay_constant in_port="BB2" max="1e-10" out_port="CZ"/> - <delay_constant in_port="BSL" max="1e-10" out_port="CZ"/> - <delay_constant in_port="TA1" max="1e-10" out_port="CZ"/> - <delay_constant in_port="TA2" max="1e-10" out_port="CZ"/> - <delay_constant in_port="TAB" max="1e-10" out_port="CZ"/> - <delay_constant in_port="TB1" max="1e-10" out_port="CZ"/> - <delay_constant in_port="TB2" max="1e-10" out_port="CZ"/> - <delay_constant in_port="TBS" max="1e-10" out_port="CZ"/> - <delay_constant in_port="TSL" max="1e-10" out_port="CZ"/> - <delay_constant in_port="F1" max="1e-10" out_port="FZ"/> - <delay_constant in_port="F2" max="1e-10" out_port="FZ"/> - <delay_constant in_port="FS" max="1e-10" out_port="FZ"/> - <T_setup clock="QCK" port="QDI" value="1e-10"/> - <T_hold clock="QCK" port="QDI" value="1e-10"/> - <T_setup clock="QCK" port="QDS" value="1e-10"/> - <T_hold clock="QCK" port="QDS" value="1e-10"/> - <T_setup clock="QCK" port="QEN" value="1e-10"/> - <T_hold clock="QCK" port="QEN" value="1e-10"/> - <T_setup clock="QCK" port="QRT" value="1e-10"/> - <T_setup clock="QCK" port="QST" value="1e-10"/> - <T_setup clock="QCK" port="QZ" value="1e-10"/> - <T_hold clock="QCK" port="QZ" value="1e-10"/> - <T_clock_to_Q clock="QCK" max="1e-10" port="QZ"/> - <delay_constant in_port="BA1" max="1e-10" out_port="QZ"/> - <delay_constant in_port="BA2" max="1e-10" out_port="QZ"/> - <delay_constant in_port="BAB" max="1e-10" out_port="QZ"/> - <delay_constant in_port="BB1" max="1e-10" out_port="QZ"/> - <delay_constant in_port="BB2" max="1e-10" out_port="QZ"/> - <delay_constant in_port="BSL" max="1e-10" out_port="QZ"/> - <delay_constant in_port="TA1" max="1e-10" out_port="QZ"/> - <delay_constant in_port="TA2" max="1e-10" out_port="QZ"/> - <delay_constant in_port="TAB" max="1e-10" out_port="QZ"/> - <delay_constant in_port="TB1" max="1e-10" out_port="QZ"/> - <delay_constant in_port="TB2" max="1e-10" out_port="QZ"/> - <delay_constant in_port="TBS" max="1e-10" out_port="QZ"/> - <delay_constant in_port="TSL" max="1e-10" out_port="QZ"/> - <delay_constant in_port="TA1" max="1e-10" out_port="TZ"/> - <delay_constant in_port="TA2" max="1e-10" out_port="TZ"/> - <delay_constant in_port="TAB" max="1e-10" out_port="TZ"/> - <delay_constant in_port="TB1" max="1e-10" out_port="TZ"/> - <delay_constant in_port="TB2" max="1e-10" out_port="TZ"/> - <delay_constant in_port="TSL" max="1e-10" out_port="TZ"/> + <output name="Z" num_pins="1"/> + <T_setup port="QZ" clock="CLK" value="1e-10"/> + <T_hold port="QZ" clock="CLK" value="1e-10"/> + <T_clock_to_Q port="QZ" clock="CLK" max="1e-10"/> + <delay_constant in_port="I0" out_port="QZ" max="2e-10"/> + <delay_constant in_port="I1" out_port="QZ" max="2e-10"/> + <delay_constant in_port="I2" out_port="QZ" max="2e-10"/> + <delay_constant in_port="I3" out_port="QZ" max="2e-10"/> + <delay_constant in_port="I0" out_port="Z" max="1e-10"/> + <delay_constant in_port="I1" out_port="Z" max="1e-10"/> + <delay_constant in_port="I2" out_port="Z" max="1e-10"/> + <delay_constant in_port="I3" out_port="Z" max="1e-10"/> </pb_type>
diff --git a/tests/no_seq/logic_macro.sim.v b/tests/no_seq/logic_macro.sim.v deleted file mode 100644 index 0f2331e..0000000 --- a/tests/no_seq/logic_macro.sim.v +++ /dev/null
@@ -1,185 +0,0 @@ -/* - * Copyright (C) 2020 The SymbiFlow Authors. - * - * Use of this source code is governed by a ISC-style - * license that can be found in the LICENSE file or at - * https://opensource.org/licenses/ISC - * - * SPDX-License-Identifier: ISC - */ - -(* whitebox *) -module LOGIC_MACRO (QST, QDS, TBS, TAB, TSL, TA1, TA2, TB1, TB2, BAB, BSL, BA1, BA2, BB1, BB2, QDI, QEN, QCK, QRT, F1, F2, FS, TZ, CZ, QZ, FZ); - - // =============== C_FRAG =============== - - (* NO_SEQ *) - input wire TBS; - (* NO_SEQ *) - input wire TAB; - (* NO_SEQ *) - input wire TSL; - (* NO_SEQ *) - input wire TA1; - (* NO_SEQ *) - input wire TA2; - (* NO_SEQ *) - input wire TB1; - (* NO_SEQ *) - input wire TB2; - (* NO_SEQ *) - input wire BAB; - (* NO_SEQ *) - input wire BSL; - (* NO_SEQ *) - input wire BA1; - (* NO_SEQ *) - input wire BA2; - (* NO_SEQ *) - input wire BB1; - (* NO_SEQ *) - input wire BB2; - - (* DELAY_CONST_TAB="1e-10" *) - (* DELAY_CONST_TSL="1e-10" *) - (* DELAY_CONST_TA1="1e-10" *) - (* DELAY_CONST_TA2="1e-10" *) - (* DELAY_CONST_TB1="1e-10" *) - (* DELAY_CONST_TB2="1e-10" *) - output wire TZ; - - (* DELAY_CONST_TBS="1e-10" *) - (* DELAY_CONST_TAB="1e-10" *) - (* DELAY_CONST_TSL="1e-10" *) - (* DELAY_CONST_TA1="1e-10" *) - (* DELAY_CONST_TA2="1e-10" *) - (* DELAY_CONST_TB1="1e-10" *) - (* DELAY_CONST_TB2="1e-10" *) - (* DELAY_CONST_BAB="1e-10" *) - (* DELAY_CONST_BSL="1e-10" *) - (* DELAY_CONST_BA1="1e-10" *) - (* DELAY_CONST_BA2="1e-10" *) - (* DELAY_CONST_BB1="1e-10" *) - (* DELAY_CONST_BB2="1e-10" *) - output wire CZ; - - // Control parameters - parameter [0:0] TAS1 = 1'b0; - parameter [0:0] TAS2 = 1'b0; - parameter [0:0] TBS1 = 1'b0; - parameter [0:0] TBS2 = 1'b0; - - parameter [0:0] BAS1 = 1'b0; - parameter [0:0] BAS2 = 1'b0; - parameter [0:0] BBS1 = 1'b0; - parameter [0:0] BBS2 = 1'b0; - - // Input routing inverters - wire TAP1 = (TAS1) ? ~TA1 : TA1; - wire TAP2 = (TAS2) ? ~TA2 : TA2; - wire TBP1 = (TBS1) ? ~TB1 : TB1; - wire TBP2 = (TBS2) ? ~TB2 : TB2; - - wire BAP1 = (BAS1) ? ~BA1 : BA1; - wire BAP2 = (BAS2) ? ~BA2 : BA2; - wire BBP1 = (BBS1) ? ~BB1 : BB1; - wire BBP2 = (BBS2) ? ~BB2 : BB2; - - // 1st mux stage - wire TAI = TSL ? TAP2 : TAP1; - wire TBI = TSL ? TBP2 : TBP1; - - wire BAI = BSL ? BAP2 : BAP1; - wire BBI = BSL ? BBP2 : BBP1; - - // 2nd mux stage - wire TZI = TAB ? TBI : TAI; - wire BZI = BAB ? BBI : BAI; - - // 3rd mux stage - wire CZI = TBS ? BZI : TZI; - - // Output - assign TZ = TZI; - assign CZ = CZI; - - // =============== Q_FRAG =============== - - (* CLOCK *) - input wire QCK; - - // Cannot model timing, VPR currently does not support async SET/RESET - (* SETUP="QCK 1e-10" *) - (* NO_COMB *) - input wire QST; - - // Cannot model timing, VPR currently does not support async SET/RESET - (* SETUP="QCK 1e-10" *) - (* NO_COMB *) - input wire QRT; - - (* SETUP="QCK 1e-10" *) - (* HOLD="QCK 1e-10" *) - (* NO_COMB *) - input wire QEN; - - (* SETUP="QCK 1e-10" *) - (* HOLD="QCK 1e-10" *) - (* NO_COMB *) - input wire QDI; - - (* SETUP="QCK 1e-10" *) - (* HOLD="QCK 1e-10" *) - (* NO_COMB *) - input wire QDS; - - (* CLK_TO_Q = "QCK 1e-10" *) - (* DELAY_CONST_TBS="1e-10" *) - (* DELAY_CONST_TAB="1e-10" *) - (* DELAY_CONST_TSL="1e-10" *) - (* DELAY_CONST_TA1="1e-10" *) - (* DELAY_CONST_TA2="1e-10" *) - (* DELAY_CONST_TB1="1e-10" *) - (* DELAY_CONST_TB2="1e-10" *) - (* DELAY_CONST_BAB="1e-10" *) - (* DELAY_CONST_BSL="1e-10" *) - (* DELAY_CONST_BA1="1e-10" *) - (* DELAY_CONST_BA2="1e-10" *) - (* DELAY_CONST_BB1="1e-10" *) - (* DELAY_CONST_BB2="1e-10" *) - (* SETUP="QCK 1e-10" *) - (* HOLD="QCK 1e-10" *) - output reg QZ; - - // Parameters - parameter [0:0] Z_QCKS = 1'b1; - - // The QZI-mux - wire QZI = (QDS) ? QDI : CZI; - - // The flip-flop - initial QZ <= 1'b0; - always @(posedge QCK or posedge QST or posedge QRT) begin - if (QST) - QZ <= 1'b1; - else if (QRT) - QZ <= 1'b0; - else if (QEN) - QZ <= QZI; - end - - // =============== F_FRAG =============== - - input wire F1; - input wire F2; - input wire FS; - - (* DELAY_CONST_F1="1e-10" *) - (* DELAY_CONST_F2="1e-10" *) - (* DELAY_CONST_FS="1e-10" *) - output wire FZ; - - // The F-mux - assign FZ = FS ? F2 : F1; - -endmodule
diff --git a/tests/no_seq/lut_ff_macro.sim.v b/tests/no_seq/lut_ff_macro.sim.v new file mode 100644 index 0000000..fad14e5 --- /dev/null +++ b/tests/no_seq/lut_ff_macro.sim.v
@@ -0,0 +1,52 @@ +/* + * Copyright (C) 2020 The SymbiFlow Authors. + * + * Use of this source code is governed by a ISC-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/ISC + * + * SPDX-License-Identifier: ISC + */ + +(* whitebox *) +module LUT_FF_MACRO (I0, I1, I2, I3, CLK, Z, QZ); + + // LUT inputs + (* NO_SEQ *) + input wire I0; + (* NO_SEQ *) + input wire I1; + (* NO_SEQ *) + input wire I2; + (* NO_SEQ *) + input wire I3; + + // Clock input + input wire CLK; + + // Combinational LUT output + (* DELAY_CONST_I0="1e-10" *) + (* DELAY_CONST_I1="1e-10" *) + (* DELAY_CONST_I2="1e-10" *) + (* DELAY_CONST_I3="1e-10" *) + output wire Z; + + // Registered LUT output + (* DELAY_CONST_I0="2e-10" *) + (* DELAY_CONST_I1="2e-10" *) + (* DELAY_CONST_I2="2e-10" *) + (* DELAY_CONST_I3="2e-10" *) + (* CLK_TO_Q="CLK 1e-10" *) + (* SETUP="CLK 1e-10" *) + (* HOLD="CLK 1e-10" *) + output reg QZ; + + // LUT behavioral model + parameter [15:0] INIT = 16'd0; + assign Z = INIT[{I3, I2, I1, I0}]; + + // FF behavioral model + always @(posedge CLK) + QZ <= Z; + +endmodule
diff --git a/tests/no_seq/lut_ff_macro.svg b/tests/no_seq/lut_ff_macro.svg new file mode 100644 index 0000000..e4316ee --- /dev/null +++ b/tests/no_seq/lut_ff_macro.svg
@@ -0,0 +1,3 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="271px" height="122px" viewBox="-0.5 -0.5 271 122" content="<mxfile host="app.diagrams.net" modified="2020-10-01T09:41:41.985Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36" version="13.7.6" etag="jLduNTopLj12nWGYQOos" type="google"><diagram id="Z8rUi5H3Rt-A41YAtYq2">7Zpdk5owFIZ/Dbc7AqJ4uepu26mdabvtdLd3GYiQNhInxBX66xskfITgKhrdL71wyCE5kPO8OYSjhj1ZJB8oWIZfiA+xYfX8xLCnhmXZgz7/zgxpbui7dm4IKPJzk1kZ7tA/KIw9YV0hH8ZSR0YIZmgpGz0SRdBjkg1QStZytznB8lWXIICK4c4DWLX+Qj4Lc6trDSv7R4iCsLiyORjlZxag6CxmEofAJ+uayb4x7AklhOVHi2QCcRa7Ii75uNstZ8sbozBi+wyw8gGPAK/E3MR9sbSYLCWryIdZ/55hj9chYvBuCbzs7JrT5baQLTBvmfxwjjCeEEwob0ck4p3GMaPkbxknPsOxuCakDCZb79sso8FVBMkCMpryLmLAQMRPCKgI57qiYfWELayTKDoCoYCg9FwFiR+IOLXHzFZCBH0uD9EklIUkIBHAN5V1LAex6jMjZClC9wcylgqtgxUjcmDza2YX6hoxCjFg6FEe1zZ/MfQrQdxjGelmqO1GBBmgAWRiUF1pDT+m+7SfmKyoBxU/GxjlbPbi01c0Pfv54zhZn0TDjYD0VQ27LRJ2NSjYeQ4FwwSx+9rxQ+bqyhGtaSI8bxqpaGxRfa4VkQmeayE0QWxZCAcIeKAI+Pb2Beq3zLCpnJNrAu63CLivQcDD3Y8tGPnX2aO+ehBpyaa1yTktkytsR2qtmSybWtuSLDsnXX2adY8kckh24Kxoel9v1EZlzWrYptUhq4hnSB6fronmTBoZymyVvc2+Iil3T8LR8GQiGXUSiYdBHCPvda1cR47l6EAm7tNu9CEpXqneEZOmvg9kcrplYprvjomjh0nTjUYme7wpvzEmpqkHiuJHIxW7E5XXtxFsItnzrXnnM15xpJGJ+v7deaVUO7tqM/dQP9dtZ/eSt3E7yby8bZzpvPFVt6vmtTeS4dN+NCJRawZvG8lwdDUc1T6OHkI73GoEppYwfivEGExYWyGnUWFvKboDjIKINzGcZx6yOg/yAL4W5gXy/U1Vr61uJFeWYn4SRYHcmm3cTrPcPCcREzU/s0rBxxWWGlBaq/uq0nTU9k21jvHtwmXbYjkjF7V08Mlwxj3DmZ6ADs1v/lR4ei14RI/vImyOrhKtBKzlJwb7RMAKHw1g5gVYF2AtJfWTAVOLDhkw6wKsCzD3jMDUikQGzL4A6wLM7J2RmFqtmMw+X2DtD6tlJ6gJFm9W/7rJ9/PVX5fsm/8=</diagram></mxfile>"><defs/><g><rect x="40" y="1" width="200" height="120" fill="none" stroke="#000000" stroke-width="2" pointer-events="all"/><path d="M 160 11 L 233.63 11" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 238.88 11 L 231.88 14.5 L 233.63 11 L 231.88 7.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="60" y="21" width="80" height="80" fill="#ffffff" stroke="#000000" stroke-width="2" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 78px; height: 1px; padding-top: 61px; margin-left: 61px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">LUT</div></div></div></foreignObject><text x="100" y="65" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">LUT</text></switch></g><path d="M 220 61 L 233.63 61" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 238.88 61 L 231.88 64.5 L 233.63 61 L 231.88 57.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="180" y="41" width="40" height="40" fill="#ffffff" stroke="#000000" stroke-width="2" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 61px; margin-left: 181px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">FF</div></div></div></foreignObject><text x="200" y="65" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">FF</text></switch></g><path d="M 160 61 L 160 11" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 140 61 L 180 61" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 30 71 L 53.63 71" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 58.88 71 L 51.88 74.5 L 53.63 71 L 51.88 67.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 30 51 L 53.63 51" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 58.88 51 L 51.88 54.5 L 53.63 51 L 51.88 47.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 30 31 L 53.63 31" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 58.88 31 L 51.88 34.5 L 53.63 31 L 51.88 27.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 30 91 L 53.63 91" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 58.88 91 L 51.88 94.5 L 53.63 91 L 51.88 87.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 30 111 L 200 111" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 200 111 L 200 87.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 200 82.12 L 203.5 89.12 L 200 87.37 L 196.5 89.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 240 11 L 250 11" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 240 60.8 L 250 60.8" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><rect x="250" y="1" width="20" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 17px; height: 1px; padding-top: 11px; margin-left: 255px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Z</div></div></div></foreignObject><text x="255" y="14" fill="#000000" font-family="Helvetica" font-size="10px">Z</text></switch></g><rect x="250" y="51" width="20" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-start; width: 17px; height: 1px; padding-top: 61px; margin-left: 255px;"><div style="box-sizing: border-box; font-size: 0; text-align: left; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">QZ</div></div></div></foreignObject><text x="255" y="64" fill="#000000" font-family="Helvetica" font-size="10px">QZ</text></switch></g><rect x="0" y="21" width="30" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 27px; height: 1px; padding-top: 31px; margin-left: -2px;"><div style="box-sizing: border-box; font-size: 0; text-align: right; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">I[0]</div></div></div></foreignObject><text x="25" y="34" fill="#000000" font-family="Helvetica" font-size="10px" text-anchor="end">I[0]</text></switch></g><rect x="0" y="41" width="30" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 27px; height: 1px; padding-top: 51px; margin-left: -2px;"><div style="box-sizing: border-box; font-size: 0; text-align: right; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">I[1]</div></div></div></foreignObject><text x="25" y="54" fill="#000000" font-family="Helvetica" font-size="10px" text-anchor="end">I[1]</text></switch></g><rect x="0" y="61" width="30" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 27px; height: 1px; padding-top: 71px; margin-left: -2px;"><div style="box-sizing: border-box; font-size: 0; text-align: right; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">I[2]</div></div></div></foreignObject><text x="25" y="74" fill="#000000" font-family="Helvetica" font-size="10px" text-anchor="end">I[2]</text></switch></g><rect x="0" y="81" width="30" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 27px; height: 1px; padding-top: 91px; margin-left: -2px;"><div style="box-sizing: border-box; font-size: 0; text-align: right; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">I[3]</div></div></div></foreignObject><text x="25" y="94" fill="#000000" font-family="Helvetica" font-size="10px" text-anchor="end">I[3]</text></switch></g><rect x="0" y="101" width="30" height="20" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 27px; height: 1px; padding-top: 111px; margin-left: -2px;"><div style="box-sizing: border-box; font-size: 0; text-align: right; "><div style="display: inline-block; font-size: 10px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">CLK</div></div></div></foreignObject><text x="25" y="114" fill="#000000" font-family="Helvetica" font-size="10px" text-anchor="end">CLK</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://desk.draw.io/support/solutions/articles/16000042487" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg> \ No newline at end of file