diff --git a/openfpga/src/base/openfpga_bitstream_command.cpp b/openfpga/src/base/openfpga_bitstream_command.cpp new file mode 100644 index 000000000..827dd1eca --- /dev/null +++ b/openfpga/src/base/openfpga_bitstream_command.cpp @@ -0,0 +1,38 @@ +/******************************************************************** + * Add commands to the OpenFPGA shell interface, + * in purpose of generate Verilog netlists modeling the full FPGA fabric + * This is one of the core engine of openfpga, including: + * - repack : create physical pbs and redo packing + *******************************************************************/ +#include "openfpga_repack.h" +#include "openfpga_bitstream_command.h" + +/* begin namespace openfpga */ +namespace openfpga { + +void add_openfpga_bitstream_commands(openfpga::Shell& shell) { + /* Get the unique id of 'build_fabric' command which is to be used in creating the dependency graph */ + const ShellCommandId& shell_cmd_build_fabric_id = shell.command(std::string("build_fabric")); + + /* Add a new class of commands */ + ShellCommandClassId openfpga_bitstream_cmd_class = shell.add_command_class("FPGA-Bitstream"); + + /******************************** + * Command 'repack' + */ + Command shell_cmd_repack("repack"); + /* Add an option '--verbose' */ + shell_cmd_repack.add_option("verbose", false, "Enable verbose output"); + + /* Add command 'repack' to the Shell */ + ShellCommandId shell_cmd_repack_id = shell.add_command(shell_cmd_repack, "Pack physical programmable logic blocks"); + shell.set_command_class(shell_cmd_repack_id, openfpga_bitstream_cmd_class); + shell.set_command_execute_function(shell_cmd_repack_id, repack); + + /* The 'repack' command should NOT be executed before 'build_fabric' */ + std::vector cmd_dependency_repack; + cmd_dependency_repack.push_back(shell_cmd_build_fabric_id); + shell.set_command_dependency(shell_cmd_repack_id, cmd_dependency_repack); +} + +} /* end namespace openfpga */ diff --git a/openfpga/src/base/openfpga_bitstream_command.h b/openfpga/src/base/openfpga_bitstream_command.h new file mode 100644 index 000000000..d58555dd8 --- /dev/null +++ b/openfpga/src/base/openfpga_bitstream_command.h @@ -0,0 +1,21 @@ +#ifndef OPENFPGA_BITSTREAM_COMMAND_H +#define OPENFPGA_BITSTREAM_COMMAND_H + +/******************************************************************** + * Include header files that are required by function declaration + *******************************************************************/ +#include "shell.h" +#include "openfpga_context.h" + +/******************************************************************** + * Function declaration + *******************************************************************/ + +/* begin namespace openfpga */ +namespace openfpga { + +void add_openfpga_bitstream_commands(openfpga::Shell& shell); + +} /* end namespace openfpga */ + +#endif diff --git a/openfpga/src/base/openfpga_repack.cpp b/openfpga/src/base/openfpga_repack.cpp new file mode 100644 index 000000000..f605233da --- /dev/null +++ b/openfpga/src/base/openfpga_repack.cpp @@ -0,0 +1,33 @@ +/******************************************************************** + * This file includes functions to compress the hierachy of routing architecture + *******************************************************************/ +/* Headers from vtrutil library */ +#include "vtr_time.h" +#include "vtr_log.h" + +#include "verilog_api.h" +#include "repack.h" +#include "openfpga_repack.h" + +/* Include global variables of VPR */ +#include "globals.h" + +/* begin namespace openfpga */ +namespace openfpga { + +/******************************************************************** + * A wrapper function to call the fabric_verilog function of FPGA-Verilog + *******************************************************************/ +void repack(OpenfpgaContext& openfpga_ctx, + const Command& cmd, const CommandContext& cmd_context) { + + CommandOptionId opt_verbose = cmd.option("verbose"); + + pack_physical_pbs(g_vpr_ctx.device(), + openfpga_ctx.mutable_vpr_device_annotation(), + openfpga_ctx.mutable_vpr_clustering_annotation(), + openfpga_ctx.vpr_routing_annotation(), + cmd_context.option_enable(cmd, opt_verbose)); +} + +} /* end namespace openfpga */ diff --git a/openfpga/src/base/openfpga_repack.h b/openfpga/src/base/openfpga_repack.h new file mode 100644 index 000000000..0fce62f78 --- /dev/null +++ b/openfpga/src/base/openfpga_repack.h @@ -0,0 +1,23 @@ +#ifndef OPENFPGA_REPACK_H +#define OPENFPGA_REPACK_H + +/******************************************************************** + * Include header files that are required by function declaration + *******************************************************************/ +#include "command.h" +#include "command_context.h" +#include "openfpga_context.h" + +/******************************************************************** + * Function declaration + *******************************************************************/ + +/* begin namespace openfpga */ +namespace openfpga { + +void repack(OpenfpgaContext& openfpga_ctx, + const Command& cmd, const CommandContext& cmd_context); + +} /* end namespace openfpga */ + +#endif diff --git a/openfpga/src/main.cpp b/openfpga/src/main.cpp index 792223e3c..c018db4bf 100644 --- a/openfpga/src/main.cpp +++ b/openfpga/src/main.cpp @@ -13,6 +13,7 @@ #include "vpr_command.h" #include "openfpga_setup_command.h" #include "openfpga_verilog_command.h" +#include "openfpga_bitstream_command.h" #include "basic_command.h" #include "openfpga_title.h" @@ -56,6 +57,9 @@ int main(int argc, char** argv) { /* Add openfpga verilog commands */ openfpga::add_openfpga_verilog_commands(shell); + /* Add openfpga bitstream commands */ + openfpga::add_openfpga_bitstream_commands(shell); + /* Add basic commands: exit, help, etc. * Note: * This MUST be the last command group to be added! diff --git a/openfpga/src/repack/repack.cpp b/openfpga/src/repack/repack.cpp new file mode 100644 index 000000000..2a7dada40 --- /dev/null +++ b/openfpga/src/repack/repack.cpp @@ -0,0 +1,32 @@ +/*************************************************************************************** + * This file includes functions that are used to redo packing for physical pbs + ***************************************************************************************/ + +/* Headers from vtrutil library */ +#include "vtr_log.h" +#include "vtr_assert.h" +#include "vtr_time.h" + +#include "repack.h" + +/* begin namespace openfpga */ +namespace openfpga { + +/*************************************************************************************** + * Top-level function to pack physical pb_graph + * This function will do : + * - create physical lb_rr_graph for each pb_graph considering physical modes only + * the lb_rr_graph willbe added to device annotation + * - annotate nets to be routed for each clustered block from operating modes of pb_graph + * to physical modes of pb_graph + * - rerun the routing for each clustered block + * - store the packing results to clustering annotation + ***************************************************************************************/ +void pack_physical_pbs(const DeviceContext& device_ctx, + VprDeviceAnnotation& device_annotation, + VprClusteringAnnotation& clustering_annotation, + const VprRoutingAnnotation& routing_annotation, + const bool& verbose) { +} + +} /* end namespace openfpga */ diff --git a/openfpga/src/repack/repack.h b/openfpga/src/repack/repack.h new file mode 100644 index 000000000..733a7d1ac --- /dev/null +++ b/openfpga/src/repack/repack.h @@ -0,0 +1,27 @@ +#ifndef REPACK_H +#define REPACK_H + +/******************************************************************** + * Include header files that are required by function declaration + *******************************************************************/ +#include "vpr_context.h" +#include "vpr_device_annotation.h" +#include "vpr_clustering_annotation.h" +#include "vpr_routing_annotation.h" + +/******************************************************************** + * Function declaration + *******************************************************************/ + +/* begin namespace openfpga */ +namespace openfpga { + +void pack_physical_pbs(const DeviceContext& device_ctx, + VprDeviceAnnotation& device_annotation, + VprClusteringAnnotation& clustering_annotation, + const VprRoutingAnnotation& routing_annotation, + const bool& verbose); + +} /* end namespace openfpga */ + +#endif