diff --git a/.travis/basic_reg_test.sh b/.travis/basic_reg_test.sh
index e466dec24..6c9e1c04d 100755
--- a/.travis/basic_reg_test.sh
+++ b/.travis/basic_reg_test.sh
@@ -12,6 +12,7 @@ echo -e "Basic regression tests";
echo -e "Testing configuration chain of a K4N4 FPGA";
python3 openfpga_flow/scripts/run_fpga_task.py full_testbench/configuration_chain --debug --show_thread_logs
+python3 openfpga_flow/scripts/run_fpga_task.py full_testbench/fast_configuration_chain --debug --show_thread_logs
python3 openfpga_flow/scripts/run_fpga_task.py preconfig_testbench/configuration_chain --debug --show_thread_logs
echo -e "Testing fram-based configuration protocol of a K4N4 FPGA";
diff --git a/docs/source/manual/arch_lang/circuit_library.rst b/docs/source/manual/arch_lang/circuit_library.rst
index e483728ed..9fe29a0fa 100644
--- a/docs/source/manual/arch_lang/circuit_library.rst
+++ b/docs/source/manual/arch_lang/circuit_library.rst
@@ -3,118 +3,6 @@
Circuit Library
---------------
-For OpenFPGA using VPR7
-~~~~~~~~~~~~~~~~~~~~~~~
-
-To support FPGA Verilog/SPICE, Verily and Bitstream Generator, physical modules containing gate-level and transistor-level features are required for FPGA primitive blocks.
-The physical modules are defined in XML syntax, similar to the original VPR FPGA architecture description language.
-
-For each module that appears in the FPGA architecture, a circuit model should be defined. In the definition of a circuit model, the user can specify if the Verilog/SPICE netlist of the module is either auto-generated or user-defined.
-
-Circuit Model Attributes
-^^^^^^^^^^^^^^^^^^^^^^^^
-
-.. code-block:: xml
-
-
-
-
-
-
-
-* **module_circuit_models**: the father node for all the circuit models. All the circuit models should be defined under this XML node.
-
- * **circuit_model**: the child node defining transistor-level modeling parameters.
-
- * **type**: can be [ ``inv_buf`` | ``pass_gate`` | ``gate`` | ``mux`` | ``wire`` | ``chan_wire`` | ``sram`` | ``lut`` | ``ff`` | ``scff`` | ``hard_logic`` | ``iopad`` ]. Specify the type of circuit model. The provided types cover all the modules in FPGAs. For the circuit models in the type of mux/wire/chan_wire/lut, FPGA-Verilog/SPICE can auto-generate Verilog/SPICE netlists. For the rest, FPGA-Verilog/SPICE requires a user-defined Verilog/SPICE netlist.
-
- * **name**: define the name of this circuit model. The name should be unique and will be used to create the sub-circuit of the circuit model in Verilog/SPICE netlists. Note that for a customized Verilog/SPICE netlist, the name defined here should be the name of the top-level sub-circuit in the customized Verilog/SPICE netlist. FPGA-Verilog/SPICE will check if the given name is conflicted with any reserved words.
-
- * **prefix**: specify the name of the circuit_model to shown in the auto-generated Verilog/SPICE netlists. The prefix can be the same as the name defined above. And again, the prefix should be unique.
-
- * **is_default**: can be [``1`` | ``0``], corresponding to [``true`` | ``false``] respectively. Specify this circuit model is the default one for some modules, such as multiplexers. If a module is not linked to any circuit model by users, FPGA-Verilog/SPICE will find the default circuit model defined in the same type and link. For a circuit model type, only one circuit model can be set as default.
-
- * **circuit_netlist**: specify the path and file name of a customized Verilog/SPICE netlist. For some modules such as SRAMs, FFs, inpads, and outpads, FPGA-Verilog/SPICE does not support auto-generation of the transistor-level sub-circuits because their circuit design is highly dependent on the technology nodes. These circuit designs should be specified by users. For the other modules that can be auto-generated by FPGA-Verilog/SPICE, the user can also define a custom netlist. Multiplexers cannot be user-defined.
-
- * **verilog_netlist**: specify the path and file name of a customized Verilog netlist. For some modules such as SRAMs, FFs, inpad and outpads, FPGA-Verilog/SPICE does not support auto-generation of the transistor-level sub-circuits because their circuit design is highly dependent on the technology nodes. These circuit designs should be specified by users. For the other modules that can be auto-generated by FPGA-Verilog/SPICE, the user can also define a custom netlist. Multiplexers cannot be user-defined.
-
- * **dump_structural_verilog**: when the value of this keyword is set to be true, Verilog generator will output gate-level netlists of this module, instead of behavior-level. Gate-level netlists bring more opportunities in layout-level optimization while behavior-level is more suitable for high-speed formal verification and easier in debugging with HDL simulators.
-
-.. note:: If netlist is not specified, FPGA-Verilog/SPICE auto-generates the Verilog/SPICE netlists for multiplexers, wires, and LUTs.
-
-.. note:: The user-defined netlists, such as LUTs, the decoding methodology should comply with the auto-generated LUTs (See Section 4.5)
-
-.. note:: Under the XML node circuit_model, the features of transistor-level designs can be defined. In the following table, we show the common features supported for all the modules. Then, we will introduce unique features supported only for some circuit models types.
-
-
-Design Technology-related Attributes
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-.. code-block:: xml
-
-
-
-
-
-
-
-
-
-* design_technology :
-
- * **type:** [cmos|rram]. Specify the type of design technology of the circuit_model.
-
-.. note:: Currently, the RRAM-based designs are only supported for multiplexers.
-
-
-Circuit Port Attributes
-^^^^^^^^^^^^^^^^^^^^^^^
-
-* input_buffer and output_buffer:
-
- * **exist:** [on|off]. Define the existence of the input_buffer or output_buffer. Note that the existence is valid for all the inputs and outputs. Note that if users want only part of the inputs (or outputs) to be buffered, this is not supported here. A solution can be building a user-defined Verilog/SPICE netlist.
-
- * **circuit_model_name:** Specify the name of circuit model which is used to implement input/output buffer, the type of specified circuit model should be inv_buf.
-
-* pass_gate_logic: defined the parameters in pass-gates, which are used in building multiplexers and LUTs.
-
- * **circuit_model_name:** Specify the name of the circuit model which is used to implement transmission gate, the type of specified circuit model should be pass_gate.
-
-* port: define the port list of a circuit model.
-
- * **type:** can be [input|output|sram|clock]. For programmable modules, such as multiplexers and LUTs, SRAM ports should be defined. For registers, such as FFs and memory banks, clock ports should be defined.
-
- * **prefix:** the name of the port to appear in the autogenerated netlists. Each port will be shown as ``[i]`` in Verilog/SPICE netlists.
-
- * **lib_name:** the name of the port defined in standard cells or customized cells. If not specified, this attribute will be the same as ``prefix``.
-
- * **size:** bandwidth of the port.
-
- * **default_val:** default logic value of a port, which is used as the initial logic value of this port in testbench generation. Can be either 0 or 1. We assume each pin of this port has the same default value.
-
- * **circuit_model_name:** only valid when the type of port is sram. Specify the name of the circuit model which is connected to this port.
-
- * **mode_select:** can be either ``true`` or ``false``. Specify if this port controls the mode switching in a configurable logic block. Only valid when the type of this port is sram. (A configurable logic block can operate in different modes, which is controlled by SRAM bits.)
-
- * **is_global:** can be either ``true`` or ``false``. Specify if this port is a global port, which will be routed globally. Note that when multiple global ports are defined with the same name, these global ports will be short-wired together.
-
- * **is_set:** can be either ``true`` or ``false``. Specify if this port controls a set signal. Only valid when ``is_global`` is true. All the set ports are connected to global set voltage stimuli in testbenches.
-
- * **is_reset:** can be either ``true`` or ``false``. Specify if this port controls a reset signal. Only valid when ``is_global`` is true. All the reset ports are connected to a global reset voltage stimuli in testbenches.
-
- * **is_config_enable:** can be either ``true`` or ``false``. Only valid when ``is_global`` is true. Specify if this port controls a configuration-enable signal. This port is only enabled during FPGA configuration, and always disabled during FPGA operation. All the ``config_enable`` ports are connected to global configuration-enable voltage stimuli in testbenches.
-
-.. note:: Different types of ``circuit_model`` have different XML syntax, with which users can highly customize their circuit topologies. See refer to examples of ``circuit_model`` for more details.
-
-.. note:: Note that we have a list of reserved port names, which indicate the usage of these ports when building FPGA fabrics. Please do not use ``mem_out``, ``mem_inv``, ``bl``, ``wl``, ``blb``, ``wlb``, ``ccff_head`` and ``ccff_tail``.
-
-For OpenFPGA using VPR8
-~~~~~~~~~~~~~~~~~~~~~~~
-
Circuit design is a dominant factor in Power, Performance, Area (P.P.A.) of FPGA fabrics.
Upon practical applications, the hardware engineers may select various circuits to implement their FPGA fabrics.
For instance, a ultra-low-power FPGA may be built with ulta-low-power circuit cells while a high-performance FPGA may use absolutely different circuit cells.
@@ -210,6 +98,17 @@ Design Technology
.. note:: Each ```` may have different technologies
+Device Technology
+^^^^^^^^^^^^^^^^^
+
+.. option::
+
+ Specify the technology binding between a circuit model and a device model which is defined in the technology library (see details in :ref:`technology_library`).
+
+ - ``device_model_name=""`` Specify the name of device model that the circuit design will use. The device model must be a valid one in the technology library.
+
+.. note:: Technology binding is only required for primitive circuit models, which are inverters, buffers, logic gates, pass gate logic, and is mandatory only when SPICE netlist generation is required.
+
Input and Output Buffers
^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/docs/source/manual/arch_lang/generality.rst b/docs/source/manual/arch_lang/generality.rst
index af7719b9a..2a4b75eb0 100644
--- a/docs/source/manual/arch_lang/generality.rst
+++ b/docs/source/manual/arch_lang/generality.rst
@@ -3,16 +3,6 @@
General Hierarchy
-----------------
-For OpenFPGA using VPR7
-~~~~~~~~~~~~~~~~~~~~~~~
-
-The extension of the VPR architectural description language is developed as an independent branch of the original one. Most of the FPGA-SPICE descriptions are located under a XML node called , which is a child node under the root node .
-Under the , some child node is created for describing SPICE simulation settings, technology library and transistor-level modeling of circuit modules.
-In the following sub-sections, we will introduce the structures of these XML nodes and the parameters provided.
-
-For OpenFPGA using VPR8
-~~~~~~~~~~~~~~~~~~~~~~~
-
OpenFPGA uses separated XMLs file other than the VPR8 architecture description file.
This is to keep a loose integration to VPR8 so that OpenFPGA can easily integrate any future version of VPR with least engineering effort.
However, to implement a physical FPGA, OpenFPGA requires the original VPR XML to include full physical design details.
diff --git a/docs/source/manual/arch_lang/simulation_setting.rst b/docs/source/manual/arch_lang/simulation_setting.rst
index d50067843..66ecc1e22 100644
--- a/docs/source/manual/arch_lang/simulation_setting.rst
+++ b/docs/source/manual/arch_lang/simulation_setting.rst
@@ -3,144 +3,6 @@
Simulation settings
-------------------
-For OpenFPGA using VPR7
-~~~~~~~~~~~~~~~~~~~~~~~
-
-All the parameters that need to be defined in the HSPICE simulations are located under a child node called , which is under its father node .
-The parameters are divided into three categories and can be defined in three XML nodes, , and , respectively.
-
-* The XML node
-
-.. code-block:: xml
-
-
-
-These properties define the options that will be printed in the top SPICE netlists.
-
-* **sim_temp:** specify the temperature which will be defined in SPICE netlists. In the top SPICE netlists, it will show as .temp .
-
-* **post:** [on|off]. Specify if the simulation waveforms should be printed out after SPICE simulations. In all the SPICE netlists, it will show as .option POST when turned on.
-
-.. note:: when the SPICE netlists are large or a long simulation duration is defined, the post option is recommended to be off. If not, huge disk space will be occupied by the waveform files.
-
-* **captab:** [on|off]. Specify if the capacitances of all the nodes in the SPICE netlists will be printed out. In the top SPICE netlists, it will show as .option CAPTAB when turned on. When turned on, the SPICE simulation runtime may increase.
-
-* The XML node
-
-.. code-block:: xml
-
-
-
-
-
-
-
-
-Define stimulates for the clock signal.
-
-* **op_freq:** either auto or a float number (unit:[Hz]) Specify the operation clock frequency that is used in SPICE simulations. This frequency is used in testbenches for operation phase simulation. Note that this is a mandatory option. Users have to specify either this frequency is automatically determined by assigning “auto” or give an exact number. If this clock frequency is specified, the sim_slack option is disregarded.
-
-* **sim_slack:** add slack to the critical path delay in the SPICE simulation. For example, sim_slack=0.2 implies that the clock period in SPICE simulations is 1.2 of the critical path delay reported by VPR. **Only valid when option op_freq is not specified.**
-
-* **prog_freq:** Specify the programming clock frequency that is used in SPICE simulations. This frequency is used in testbenches for programming phase simulation.
-
-* **slew_type & slew_time:** define the slew of clock signals at the rising/falling edge. Property slew_type can be either absolute or fractional [abs|frac].
-
- * The type of **absolute** implies that the slew time is the absolute value. For example, slew_time=20e-12, slew_type=abs means that the slew of a clock signal is 20ps.
- * The type of **fractional** means that the slew time is related to the period (frequency) of the clock signal. For example, slew_time=0.05, slew_type=frac means that the slew of a clock signal takes 5% of the period of the clock.
-
-:numref:`fig_meas_edge` depicts the definition of the slew and delays of signals and the parameters that can be supported by FPGA-SPICE.
-
-.. code-block:: xml
-
-
-
-
-
-
-
-
-Define the slew of input signals at the rising/falling edge.
-
-* **slew_type & slew_time:** define the slew of all the input signals at the rising/falling edge. Property slew_type can be either absolute or fractional [abs|frac].
-
- * The type of **absolute** implies that the slew time is the absolute value. For example, slew_time=20e-12, slew_type=abs means that the slew of a clock signal is 20ps.
-
- * The type of **fractional** means that the slew time is related to the period (frequency) of the clock signal. For example, slew_time=0.05, slew_type=frac means that the slew of a clock signal takes 5% of the period of the clock.
-
-.. note:: These slew settings are valid for all the input signals of the testbenches in different complexity levels.
-
-.. _fig_meas_edge:
-
-.. figure:: figures/meas_edge.png
- :scale: 100%
- :alt: map to buried traesure
-
- Parameters in measuring the slew and delay of signals
-
-* The XML node
-
-.. code-block:: xml
-
-
-
-* **sim_num_clock_cycle:** can be either “auto” or an integer. By setting to “auto”, FPGA-SPICE automatically determines the number of clock cycles to simulate, which is related to the average of all the signal density in ACE2 results. When set to an integer, FPGA-SPICE will use the given number of clock cycles in the SPICE netlists.
-
-* **accuracy_type:** [abs|frac]. Specify the type of transient step in SPICE simulation.
-
- * When **abs** is selected, the accuracy should be the absolute value, such as 1e-12.
-
- * When **frac** is selected, the accuracy is the number of simulation points in a clock cycle period, for example, 100.
-
-* **accuracy:** specify the transient step in SPICE simulation. Typically, the smaller the step is, the higher the accuracy that can be reached while the long simulation runtime is. The recommended accuracy is between 0.1ps and 0.01ps, which generates good accuracy and runtime is not significantly long.
-
-.. note:: Users can define the parameters in measuring the slew of signals, under a child node of the node .
-
-.. code-block:: xml
-
-
-
-Define the starting and ending point in measuring the slew of a rising edge of a signal.
-
-* **upper_thres_pct:** the ending point in measuring the slew of a rising edge. It is expressed as a percentage of the maximum voltage of a signal. For example, the meaning of upper_thres_pct=0.95 is depicted in Figure 2.
-
-* **lower_thres_pct:** the starting point in measuring the slew of a rising edge. It is expressed as a percentage of the maximum voltage of a signal. For example, the meaning of lower_thres_pct=0.05 is depicted in Figure 2.
-
-.. code-block:: xml
-
-
-
-* **upper_thres_pct:** the ending point in measuring the slew of a falling edge. It is expressed as a percentage of the maximum voltage of a signal. For example, the meaning of upper_thres_pct=0.05 is depicted in Figure 2.
-
- * **lower_thres_pct:** the starting point in measuring the slew of a falling edge. It is expressed as a percentage of the maximum voltage of a signal. For example, the meaning of lower_thres_pct=0.95 is depicted in Figure 2.
-
-
-.. note:: Users can define the parameters related to measurements of delays between signals, under a child node of the node .
-
-.. code-block:: xml
-
-
-
-Define the starting and ending point in measuring the delay between two signals when they are both at a rising edge.
-
-* **input_thres_pct:** the starting point in measuring the delay of a rising edge. It is expressed as a percentage of the maximum voltage of a signal. For example, the meaning of input_thres_pct=0.5 is depicted in Figure 2.
-
-* **output_thres_pct:** the ending point in measuring the delay of a rising edge. It is expressed as a percentage of the maximum voltage of a signal. For example, the meaning of output_thres_pct=0.5 is depicted in Figure 2.
-
-.. code-block:: xml
-
-
-
-Define the starting and ending point in measuring the delay between two signals when they are both at a falling edge.
-
-* **input_thres_pct:** the starting point in measuring the delay of a falling edge. It is expressed as a percentage of the maximum voltage of a signal. For example, upper_thres_pct=0.5 is depicted in :numref:`fig_meas_edge`.
-
-* **output_thres_pct:** the ending point in measuring the delay of a falling edge. It is expressed as a percentage of the maximum voltage of a signal. For example, lower_thres_pct=0. 5 is depicted in :numref:`fig_meas_edge`.
-
-
-For OpenFPGA using VPR8
-~~~~~~~~~~~~~~~~~~~~~~~
-
All the simulation settings are stored under the XML node ````
General organization is as follows
@@ -181,7 +43,7 @@ General organization is as follows
Clock Setting
-^^^^^^^^^^^^^
+~~~~~~~~~~~~~
Clock setting focuses on defining the clock periods to applied on FPGA fabrics
As a programmable device, an FPGA has two types of clocks.
The first is the operating clock, which is applied by users' implementations.
@@ -197,7 +59,7 @@ We should the full syntax in the code block below and then provide details on ea
Operating clock setting
-```````````````````````
+^^^^^^^^^^^^^^^^^^^^^^^
Operating clocks are defined under the XML node ````
.. option::
@@ -225,7 +87,7 @@ Operating clocks are defined under the XML node ````
.. warning:: Avoid to use a negative slack! This may cause your simulation to fail!
Programming clock setting
-`````````````````````````
+^^^^^^^^^^^^^^^^^^^^^^^^^
Programming clocks are defined under the XML node ````
.. option::
@@ -237,13 +99,13 @@ Programming clocks are defined under the XML node ````
.. note:: Programming clock frequency is typically much slower than the operating clock and strongly depends on the process technology. Suggest to characterize the speed of your configuration protocols before specifying a value!
Simulator Option
-^^^^^^^^^^^^^^^^
+~~~~~~~~~~~~~~~~
This XML node includes universal options available in both HDL and SPICE simulators.
.. note:: This is mainly used by FPGA-SPICE
Operating condition
-```````````````````
+^^^^^^^^^^^^^^^^^^^
.. option:: ``
@@ -255,7 +117,7 @@ Operating condition
.temp
Output logs
-```````````
+^^^^^^^^^^^
.. option:: ``
@@ -281,7 +143,7 @@ Output logs
.. note:: When turned on, the SPICE simulation runtime may increase.
Simulation Accuracy
-```````````````````
+^^^^^^^^^^^^^^^^^^^
.. option:: ``
@@ -300,7 +162,7 @@ Simulation Accuracy
Specify the transient step in SPICE simulation. Typically, the smaller the step is, the higher the accuracy that can be reached while the long simulation runtime is. The recommended accuracy is between 0.1ps and 0.01ps, which generates good accuracy and runtime is not significantly long.
Simulation Speed
-````````````````
+^^^^^^^^^^^^^^^^
.. option::
@@ -317,7 +179,7 @@ Simulation Speed
.option fast
Monte Carlo Simulation
-``````````````````````
+~~~~~~~~~~~~~~~~~~~~~~
.. option::
@@ -331,7 +193,7 @@ Monte Carlo Simulation
The larger the number is, the longer simulation time will be but more accurate the results will be.
Measurement Setting
-```````````````````
+~~~~~~~~~~~~~~~~~~~
- Users can define the parameters in measuring the slew of signals, under XML node ````
- Users can define the parameters in measuring the delay of signals, under XML node ````
@@ -355,7 +217,7 @@ Both delay and slew measurement share the same syntax in defining the upper and
An illustrative example on measuring the slew and delay of signals
Stimulus Setting
-````````````````
+~~~~~~~~~~~~~~~~
Users can define the slew time of input and clock signals to be applied to FPGA I/Os in testbenches under XML node ```` and ```` respectively.
This is used by FPGA-SPICE in generating testbenches
diff --git a/docs/source/manual/arch_lang/technology_library.rst b/docs/source/manual/arch_lang/technology_library.rst
index 5089f9f2e..08b6c62d9 100644
--- a/docs/source/manual/arch_lang/technology_library.rst
+++ b/docs/source/manual/arch_lang/technology_library.rst
@@ -3,43 +3,6 @@
Technology library
------------------
-For OpenFPGA using VPR7
-~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block:: xml
-
-
-
-* **lib_type:** can be either industry or academia [industry|academia]. For the industry library, some transistor types are available, and the type of transistor should be declared in the property transistor_type.
-
-* **transistor_type:** This XML property specify the transistors to be used in the industry library. For example, the type of transistors can be “TT”, “FF” etc.
-
-* **lib_path:** specify the path of the library. For example: lib_path=/home/tech/45nm.pm.
-
-* **nominal_vdd:** specify the working voltage for the technology. The voltage will be used as the supply voltage in all the SPICE netlist.
-
-.. code-block:: xml
-
-
-
-* **pn_ratio:** specify the ratio between p-type transistors and n-type transistors. The ratio will be used when building circuit structures such as inverters, buffers, etc.
-
-* **model_ref:** specify the reference of in calling a transistor model. In SPICE netlist, define a transistor follows the convention: . The reference depends on the technology and the type of library. For example, the PTM bulk model uses “M” as the reference while the PTM FinFET model uses “X” as the reference.
-
-.. code-block:: xml
-
-
-
-
-* **model_name:** specify the name of the p/n type transistor, which can be found in the manual of the technology provider.
-
-* **chan_length:** specify the channel length of p/n type transistor.
-
-* **min_width:** specify the minimum width of p/n type transistor. This parameter will be used in building inverter, buffer, etc. as a base number for transistor sizing.
-
-For OpenFPGA using VPR8
-~~~~~~~~~~~~~~~~~~~~~~~
-
Technology library aims to describe transistor-level parameters to be applied to the physical design of FPGAs. In addition to transistor models, technology library also supports the definition of process variations on any transistor models.
General organization is as follows.
diff --git a/libopenfpga/libarchopenfpga/src/circuit_library.cpp b/libopenfpga/libarchopenfpga/src/circuit_library.cpp
index a235e53af..cccc62e71 100644
--- a/libopenfpga/libarchopenfpga/src/circuit_library.cpp
+++ b/libopenfpga/libarchopenfpga/src/circuit_library.cpp
@@ -120,6 +120,13 @@ bool CircuitLibrary::is_power_gated(const CircuitModelId& model_id) const {
return is_power_gated_[model_id];
}
+/* Access the device model name that is binded to a circuit model */
+std::string CircuitLibrary::device_model_name(const CircuitModelId& model_id) const {
+ /* validate the model_id */
+ VTR_ASSERT(valid_model_id(model_id));
+ return device_model_names_[model_id];
+}
+
/* Return a flag showing if inputs are buffered for a circuit model */
bool CircuitLibrary::is_input_buffered(const CircuitModelId& model_id) const {
/* validate the model_id */
@@ -1135,6 +1142,9 @@ CircuitModelId CircuitLibrary::add_model(const enum e_circuit_model_type& type)
/* Design technology information */
design_tech_types_.push_back(NUM_CIRCUIT_MODEL_DESIGN_TECH_TYPES);
is_power_gated_.push_back(false);
+
+ /* Device technology information */
+ device_model_names_.emplace_back();
/* Buffer existence */
buffer_existence_.emplace_back();
@@ -1263,6 +1273,13 @@ void CircuitLibrary::set_model_is_power_gated(const CircuitModelId& model_id, co
return;
}
+/* Set the device model name that is binded to a Circuit Model */
+void CircuitLibrary::set_device_model_name(const CircuitModelId& model_id, const std::string& name) {
+ /* validate the model_id */
+ VTR_ASSERT(valid_model_id(model_id));
+ device_model_names_[model_id] = name;
+}
+
/* Set input buffer information for the circuit model */
void CircuitLibrary::set_model_input_buffer(const CircuitModelId& model_id,
const bool& existence, const std::string& model_name) {
diff --git a/libopenfpga/libarchopenfpga/src/circuit_library.h b/libopenfpga/libarchopenfpga/src/circuit_library.h
index c6a62dc27..abb03d1f8 100644
--- a/libopenfpga/libarchopenfpga/src/circuit_library.h
+++ b/libopenfpga/libarchopenfpga/src/circuit_library.h
@@ -194,8 +194,11 @@ class CircuitLibrary {
bool model_is_default(const CircuitModelId& model_id) const;
bool dump_structural_verilog(const CircuitModelId& model_id) const;
bool dump_explicit_port_map(const CircuitModelId& model_id) const;
+ /* Design technology information */
enum e_circuit_model_design_tech design_tech_type(const CircuitModelId& model_id) const;
bool is_power_gated(const CircuitModelId& model_id) const;
+ /* Device technology information */
+ std::string device_model_name(const CircuitModelId& model_id) const;
/* General buffer information */
bool is_input_buffered(const CircuitModelId& model_id) const;
bool is_output_buffered(const CircuitModelId& model_id) const;
@@ -319,6 +322,8 @@ class CircuitLibrary {
/* Design technology information */
void set_model_design_tech_type(const CircuitModelId& model_id, const enum e_circuit_model_design_tech& design_tech_type);
void set_model_is_power_gated(const CircuitModelId& model_id, const bool& is_power_gated);
+ /* Design technology information */
+ void set_device_model_name(const CircuitModelId& model_id, const std::string& name);
/* Buffer existence */
void set_model_input_buffer(const CircuitModelId& model_id,
const bool& existence, const std::string& model_name);
@@ -513,6 +518,9 @@ class CircuitLibrary {
vtr::vector design_tech_types_;
vtr::vector is_power_gated_;
+ /* Device technology information */
+ vtr::vector device_model_names_;
+
/* Buffer existence */
vtr::vector> buffer_existence_;
vtr::vector> buffer_model_names_;
diff --git a/libopenfpga/libarchopenfpga/src/openfpga_arch.h b/libopenfpga/libarchopenfpga/src/openfpga_arch.h
index 33d8f1b6c..68d0b6f68 100644
--- a/libopenfpga/libarchopenfpga/src/openfpga_arch.h
+++ b/libopenfpga/libarchopenfpga/src/openfpga_arch.h
@@ -29,6 +29,9 @@ struct Arch {
/* Technology devices */
TechnologyLibrary tech_lib;
+ /* Binding between circuit models and technology models */
+ std::map circuit_tech_binding;
+
/* Configuration protocol settings */
ConfigProtocol config_protocol;
diff --git a/libopenfpga/libarchopenfpga/src/openfpga_arch_linker.cpp b/libopenfpga/libarchopenfpga/src/openfpga_arch_linker.cpp
index 90ae1aad3..eab105ec3 100644
--- a/libopenfpga/libarchopenfpga/src/openfpga_arch_linker.cpp
+++ b/libopenfpga/libarchopenfpga/src/openfpga_arch_linker.cpp
@@ -16,7 +16,7 @@ void link_config_protocol_to_circuit_library(openfpga::Arch& openfpga_arch) {
/* Error out if the circuit model id is invalid */
if (CircuitModelId::INVALID() == config_memory_model) {
- VTR_LOG("Invalid memory model name (=%s) defined in !",
+ VTR_LOG("Invalid memory model name '%s' defined in !",
openfpga_arch.config_protocol.memory_model_name().c_str());
exit(1);
}
@@ -24,6 +24,32 @@ void link_config_protocol_to_circuit_library(openfpga::Arch& openfpga_arch) {
openfpga_arch.config_protocol.set_memory_model(config_memory_model);
}
+/********************************************************************
+ * Link the circuit model of circuit library
+ * to these device model defined in technology library
+ *******************************************************************/
+void bind_circuit_model_to_technology_model(openfpga::Arch& openfpga_arch) {
+ /* Ensure a clean start */
+ openfpga_arch.circuit_tech_binding.clear();
+
+ for (const CircuitModelId& circuit_model : openfpga_arch.circuit_lib.models()) {
+ const std::string device_model_name = openfpga_arch.circuit_lib.device_model_name(circuit_model);
+ if (true == device_model_name.empty()) {
+ continue;
+ }
+ /* Try to find the device model name in technology library */
+ TechnologyModelId tech_model = openfpga_arch.tech_lib.model(device_model_name);
+ if (false == openfpga_arch.tech_lib.valid_model_id(tech_model)) {
+ VTR_LOG("Invalid device model name '%s' defined in circuit model '%s'!",
+ device_model_name.c_str(),
+ openfpga_arch.circuit_lib.model_name(circuit_model).c_str());
+ exit(1);
+ }
+ /* Create binding */
+ openfpga_arch.circuit_tech_binding[circuit_model] = tech_model;
+ }
+}
+
/********************************************************************
* Link the circuit model of SRAM ports of each circuit model
* to a default SRAM circuit model.
diff --git a/libopenfpga/libarchopenfpga/src/openfpga_arch_linker.h b/libopenfpga/libarchopenfpga/src/openfpga_arch_linker.h
index 52e49cb66..a6c966058 100644
--- a/libopenfpga/libarchopenfpga/src/openfpga_arch_linker.h
+++ b/libopenfpga/libarchopenfpga/src/openfpga_arch_linker.h
@@ -5,6 +5,8 @@
void link_config_protocol_to_circuit_library(openfpga::Arch& openfpga_arch);
+void bind_circuit_model_to_technology_model(openfpga::Arch& openfpga_arch);
+
void config_circuit_models_sram_port_to_default_sram_model(CircuitLibrary& circuit_lib,
const CircuitModelId& default_sram_model);
diff --git a/libopenfpga/libarchopenfpga/src/read_xml_circuit_library.cpp b/libopenfpga/libarchopenfpga/src/read_xml_circuit_library.cpp
index 7a894ab34..9fb61a654 100644
--- a/libopenfpga/libarchopenfpga/src/read_xml_circuit_library.cpp
+++ b/libopenfpga/libarchopenfpga/src/read_xml_circuit_library.cpp
@@ -397,6 +397,27 @@ void read_xml_model_design_technology(pugi::xml_node& xml_model,
}
}
+/********************************************************************
+ * Parse XML codes of device technology of a circuit model to circuit library
+ *******************************************************************/
+static
+void read_xml_model_device_technology(pugi::xml_node& xml_model,
+ const pugiutil::loc_data& loc_data,
+ CircuitLibrary& circuit_lib, const CircuitModelId& model) {
+
+ auto xml_device_tech = get_single_child(xml_model, "device_technology", loc_data, pugiutil::ReqOpt::OPTIONAL);
+
+ if (!xml_device_tech) {
+ return;
+ }
+
+ /* Parse device model name */
+ const char* device_model_name_attr = get_attribute(xml_device_tech, "device_model_name", loc_data, pugiutil::ReqOpt::OPTIONAL).value();
+ if (nullptr != device_model_name_attr) {
+ circuit_lib.set_device_model_name(model, std::string(device_model_name_attr));
+ }
+}
+
/********************************************************************
* This is a generic function to parse XML codes that describe
* a buffer of a circuit model to circuit library
@@ -698,6 +719,18 @@ void read_xml_circuit_model(pugi::xml_node& xml_model,
}
}
+ /* Parse device technology attributes
+ * This is applicable to only atom circuit models:
+ * - inverter/buffer
+ * - pass gate
+ * - logic gates
+ */
+ if ((CIRCUIT_MODEL_INVBUF == circuit_lib.model_type(model))
+ || (CIRCUIT_MODEL_PASSGATE == circuit_lib.model_type(model))
+ || (CIRCUIT_MODEL_GATE == circuit_lib.model_type(model))) {
+ read_xml_model_device_technology(xml_model, loc_data, circuit_lib, model);
+ }
+
/* Input buffer attributes, NOT required for circuit models which are inverters or buffers */
if (CIRCUIT_MODEL_INVBUF != circuit_lib.model_type(model)) {
auto xml_input_buffer = get_single_child(xml_model, "input_buffer", loc_data);
diff --git a/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.cpp b/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.cpp
index 1d5f23e9e..6bc31ef46 100644
--- a/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.cpp
+++ b/libopenfpga/libarchopenfpga/src/read_xml_openfpga_arch.cpp
@@ -64,6 +64,9 @@ openfpga::Arch read_xml_openfpga_arch(const char* arch_file_name) {
/* Build the internal link for technology library */
openfpga_arch.tech_lib.link_models_to_variations();
+ /* Binding circuit models to device models */
+ bind_circuit_model_to_technology_model(openfpga_arch);
+
/* Parse configuration protocol to data structure */
openfpga_arch.config_protocol = read_xml_config_protocol(xml_openfpga_arch, loc_data);
diff --git a/libopenfpga/libarchopenfpga/src/technology_library.cpp b/libopenfpga/libarchopenfpga/src/technology_library.cpp
index 4ee9bf1c6..3f8e8e7f9 100644
--- a/libopenfpga/libarchopenfpga/src/technology_library.cpp
+++ b/libopenfpga/libarchopenfpga/src/technology_library.cpp
@@ -54,7 +54,7 @@ std::string TechnologyLibrary::model_name(const TechnologyModelId& model_id) con
*/
TechnologyModelId TechnologyLibrary::model(const std::string& name) const {
std::map::const_iterator it = model_name2ids_.find(name);
- if (it != model_name2ids_.end()) {
+ if (it == model_name2ids_.end()) {
return TechnologyModelId::INVALID();
}
diff --git a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp
index 9e7bde572..0f5640618 100644
--- a/openfpga/src/fpga_verilog/verilog_top_testbench.cpp
+++ b/openfpga/src/fpga_verilog/verilog_top_testbench.cpp
@@ -561,6 +561,7 @@ void print_verilog_top_testbench_ports(std::fstream& fp,
static
size_t calculate_num_config_clock_cycles(const e_config_protocol_type& sram_orgz_type,
const bool& fast_configuration,
+ const BitstreamManager& bitstream_manager,
const FabricBitstream& fabric_bitstream) {
size_t num_config_clock_cycles = 1 + fabric_bitstream.num_bits();
@@ -573,7 +574,24 @@ size_t calculate_num_config_clock_cycles(const e_config_protocol_type& sram_orgz
num_config_clock_cycles = 2;
break;
case CONFIG_MEM_SCAN_CHAIN:
- /* Fast configuraiton is not applicable to configuration chain protocol*/
+ /* For fast configuraiton, the bitstream size counts from the first bit '1' */
+ if (true == fast_configuration) {
+ size_t full_num_config_clock_cycles = num_config_clock_cycles;
+ size_t num_bits_to_skip = 0;
+ for (const FabricBitId& bit_id : fabric_bitstream.bits()) {
+ if (true == bitstream_manager.bit_value(fabric_bitstream.config_bit(bit_id))) {
+ break;
+ }
+ num_bits_to_skip++;
+ }
+
+ num_config_clock_cycles = full_num_config_clock_cycles - num_bits_to_skip;
+
+ VTR_LOG("Fast configuration reduces number of configuration clock cycles from %lu to %lu (compression_rate = %f%)\n",
+ full_num_config_clock_cycles,
+ num_config_clock_cycles,
+ 100. * ((float)num_config_clock_cycles / (float)full_num_config_clock_cycles - 1.));
+ }
break;
case CONFIG_MEM_MEMORY_BANK:
case CONFIG_MEM_FRAME_BASED: {
@@ -1108,6 +1126,7 @@ void print_verilog_top_testbench_vanilla_bitstream(std::fstream& fp,
*******************************************************************/
static
void print_verilog_top_testbench_configuration_chain_bitstream(std::fstream& fp,
+ const bool& fast_configuration,
const BitstreamManager& bitstream_manager,
const FabricBitstream& fabric_bitstream) {
/* Validate the file stream */
@@ -1132,10 +1151,23 @@ void print_verilog_top_testbench_configuration_chain_bitstream(std::fstream& fp,
fp << std::endl;
- /* Attention: the configuration chain protcol requires the last configuration bit is fed first
- * We will visit the fabric bitstream in a reverse way
+ /* Attention: when the fast configuration is enabled, we will start from the first bit '1'
+ * This requires a reset signal (as we forced in the first clock cycle)
*/
+ bool first_bit_one = false;
for (const FabricBitId& bit_id : fabric_bitstream.bits()) {
+ if (true == bitstream_manager.bit_value(fabric_bitstream.config_bit(bit_id))) {
+ first_bit_one = true;
+ }
+
+ /* In fast configuration mode, we do not output anything
+ * until we have to (the first bit '1' detected)
+ */
+ if ( (true == fast_configuration)
+ && (false == first_bit_one)) {
+ continue;
+ }
+
fp << "\t\t" << std::string(TOP_TESTBENCH_PROG_TASK_NAME);
fp << "(1'b" << (size_t)bitstream_manager.bit_value(fabric_bitstream.config_bit(bit_id)) << ");" << std::endl;
}
@@ -1382,7 +1414,8 @@ void print_verilog_top_testbench_bitstream(std::fstream& fp,
bitstream_manager, fabric_bitstream);
break;
case CONFIG_MEM_SCAN_CHAIN:
- print_verilog_top_testbench_configuration_chain_bitstream(fp, bitstream_manager, fabric_bitstream);
+ print_verilog_top_testbench_configuration_chain_bitstream(fp, fast_configuration,
+ bitstream_manager, fabric_bitstream);
break;
case CONFIG_MEM_MEMORY_BANK:
print_verilog_top_testbench_memory_bank_bitstream(fp, fast_configuration,
@@ -1471,6 +1504,7 @@ void print_verilog_top_testbench(const ModuleManager& module_manager,
/* Estimate the number of configuration clock cycles */
size_t num_config_clock_cycles = calculate_num_config_clock_cycles(sram_orgz_type,
fast_configuration,
+ bitstream_manager,
fabric_bitstream);
/* Generate stimuli for general control signals */
diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml
index 14a7881ef..110ea66a9 100644
--- a/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_bank_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_cc_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_cc_openfpga.xml
index 13eb292b0..f1db02ad1 100644
--- a/openfpga_flow/openfpga_arch/k4_N4_40nm_cc_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_cc_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
@@ -92,8 +96,8 @@
-
-
+
+
@@ -101,17 +105,8 @@
-
-
-
-
-
-
-
-
-
-
-
+
+
@@ -166,10 +161,10 @@
-
+
-
+
@@ -186,7 +181,7 @@
-
+
diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_fixed_sim_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_fixed_sim_openfpga.xml
index 13eb292b0..95359f565 100644
--- a/openfpga_flow/openfpga_arch/k4_N4_40nm_fixed_sim_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_fixed_sim_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml
index da2322044..b89a23644 100644
--- a/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_frame_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k4_N4_40nm_standalone_openfpga.xml b/openfpga_flow/openfpga_arch/k4_N4_40nm_standalone_openfpga.xml
index 05b096a03..035732d35 100644
--- a/openfpga_flow/openfpga_arch/k4_N4_40nm_standalone_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k4_N4_40nm_standalone_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k6_N10_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_N10_40nm_openfpga.xml
index 9512672a9..81e60ee3a 100644
--- a/openfpga_flow/openfpga_arch/k6_N10_40nm_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k6_N10_40nm_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml
index 2127c0b3c..06ef4506d 100644
--- a/openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k6_N10_intermediate_buffer_40nm_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml
index 222d0d3e6..ae4e5d1e1 100644
--- a/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k6_frac_N10_40nm_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
@@ -77,6 +81,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_40nm_openfpga.xml
index be9bd0d3b..bbc33f2e8 100644
--- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_40nm_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_40nm_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
@@ -77,6 +81,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_40nm_openfpga.xml
index 6dfb6ac71..c4d47ad2c 100644
--- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_40nm_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_40nm_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
@@ -77,6 +81,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_aib_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_aib_40nm_openfpga.xml
index 81dfd17ce..5925aeb2d 100644
--- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_aib_40nm_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_chain_mem16K_aib_40nm_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
@@ -77,6 +81,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_column_chain_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_column_chain_40nm_openfpga.xml
index 9a5d94056..f2265e48c 100644
--- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_column_chain_40nm_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_column_chain_40nm_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
@@ -77,6 +81,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_chain_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_chain_40nm_openfpga.xml
index d2cb8a163..3597e7c50 100644
--- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_chain_40nm_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_chain_40nm_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
@@ -77,6 +81,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_40nm_openfpga.xml
index 129e11f71..b17169f78 100644
--- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_40nm_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_40nm_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
@@ -77,6 +81,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_40nm_openfpga.xml
index f22ec1fc9..f26140913 100644
--- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_40nm_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_40nm_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
@@ -77,6 +81,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml
index 650e30a6b..0fa650846 100644
--- a/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k6_frac_N10_adder_register_scan_chain_depop50_spypad_40nm_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
@@ -77,6 +81,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_behavioral_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_behavioral_40nm_openfpga.xml
index 2d6a765d0..e4a721acb 100644
--- a/openfpga_flow/openfpga_arch/k6_frac_N10_behavioral_40nm_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k6_frac_N10_behavioral_40nm_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
@@ -77,6 +81,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml
index b351666a7..51e8fca53 100644
--- a/openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k6_frac_N10_local_encoder_40nm_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
@@ -77,6 +81,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_spyio_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_spyio_40nm_openfpga.xml
index 94c8f9fb8..9ce18bc81 100644
--- a/openfpga_flow/openfpga_arch/k6_frac_N10_spyio_40nm_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k6_frac_N10_spyio_40nm_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
@@ -77,6 +81,7 @@
+
diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_stdcell_mux_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_stdcell_mux_40nm_openfpga.xml
index 794f10d4f..cfda3061f 100644
--- a/openfpga_flow/openfpga_arch/k6_frac_N10_stdcell_mux_40nm_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k6_frac_N10_stdcell_mux_40nm_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
@@ -84,6 +88,7 @@
-->
+
diff --git a/openfpga_flow/openfpga_arch/k6_frac_N10_tree_mux_40nm_openfpga.xml b/openfpga_flow/openfpga_arch/k6_frac_N10_tree_mux_40nm_openfpga.xml
index e9081fa86..e8980c6c3 100644
--- a/openfpga_flow/openfpga_arch/k6_frac_N10_tree_mux_40nm_openfpga.xml
+++ b/openfpga_flow/openfpga_arch/k6_frac_N10_tree_mux_40nm_openfpga.xml
@@ -30,6 +30,7 @@
+
@@ -41,6 +42,7 @@
+
@@ -52,6 +54,7 @@
+
@@ -63,6 +66,7 @@
+
@@ -77,6 +81,7 @@
+
diff --git a/openfpga_flow/tasks/full_testbench/fast_configuration_chain/config/task.conf b/openfpga_flow/tasks/full_testbench/fast_configuration_chain/config/task.conf
new file mode 100644
index 000000000..8fabc7635
--- /dev/null
+++ b/openfpga_flow/tasks/full_testbench/fast_configuration_chain/config/task.conf
@@ -0,0 +1,36 @@
+# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
+# Configuration file for running experiments
+# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
+# timeout_each_job : FPGA Task script splits fpga flow into multiple jobs
+# Each job execute fpga_flow script on combination of architecture & benchmark
+# timeout_each_job is timeout for each job
+# = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
+
+[GENERAL]
+run_engine=openfpga_shell
+openfpga_shell_template=${PATH:OPENFPGA_PATH}/openfpga_flow/OpenFPGAShellScripts/fast_configuration_example_script.openfpga
+power_tech_file = ${PATH:OPENFPGA_PATH}/openfpga_flow/tech/PTM_45nm/45nm.xml
+power_analysis = true
+spice_output=false
+verilog_output=true
+timeout_each_job = 20*60
+fpga_flow=vpr_blif
+openfpga_arch_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_arch/k4_N4_40nm_cc_openfpga.xml
+openfpga_sim_setting_file=${PATH:OPENFPGA_PATH}/openfpga_flow/openfpga_simulation_settings/auto_sim_openfpga.xml
+external_fabric_key_file=
+
+[ARCHITECTURES]
+arch0=${PATH:OPENFPGA_PATH}/openfpga_flow/vpr_arch/k4_N4_tileable_40nm.xml
+
+[BENCHMARKS]
+bench0=${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.blif
+
+[SYNTHESIS_PARAM]
+bench0_top = and2
+bench0_act = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.act
+bench0_verilog = ${PATH:OPENFPGA_PATH}/openfpga_flow/benchmarks/micro_benchmark/and2/and2.v
+bench0_chan_width = 300
+
+[SCRIPT_PARAM_MIN_ROUTE_CHAN_WIDTH]
+end_flow_with_test=
+#vpr_fpga_verilog_formal_verification_top_netlist=