Skip to content

Commit

Permalink
[core] upgrading netlist generator
Browse files Browse the repository at this point in the history
  • Loading branch information
tangxifan committed Apr 22, 2023
1 parent 02e964b commit 5500b9a
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 17 deletions.
22 changes: 13 additions & 9 deletions libs/libarchopenfpga/src/config_protocol.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,12 +31,14 @@ class ConfigProtocol {
CircuitModelId memory_model() const;
int num_regions() const;

/* Get information of the programming clock port: name and width */
openfpga::BasicPort prog_clock_port_info() const;
/* Get a list of programming clock pins, flatten from the programming clock port */
std::vector<openfpga::BasicPort> prog_clock_pins() const;
/* Get a list of programming clock ports */
std::vector<openfpga::BasicPort> prog_clock_ports() const;
/* Get a list of programming clock ports */
std::string prog_clock_port_ccff_head_indices_str(
std::string prog_clock_pin_ccff_head_indices_str(
const openfpga::BasicPort& port) const;
std::vector<size_t> prog_clock_port_ccff_head_indices(
std::vector<size_t> prog_clock_pin_ccff_head_indices(
const openfpga::BasicPort& port) const;

e_blwl_protocol_type bl_protocol_type() const;
Expand All @@ -54,10 +56,12 @@ class ConfigProtocol {
void set_memory_model(const CircuitModelId& memory_model);
void set_num_regions(const int& num_regions);

/* Add a pair of programming clock port and ccff head indices. This API will
/* Add the programming clock port */
void set_prog_clock_port(const openfpga::BasicPort& port);
/* Add a pair of programming clock pin and ccff head indices. This API will
* parse the index list, e.g., "0,1" to a vector of integers [0 1] */
void set_prog_clock_port_ccff_head_indices_pair(
const openfpga::BasicPort& port, const std::string& indices_str);
void set_prog_clock_pin_ccff_head_indices_pair(
const openfpga::BasicPort& pin, const std::string& indices_str);

void set_bl_protocol_type(const e_blwl_protocol_type& type);
void set_bl_memory_model_name(const std::string& memory_model_name);
Expand Down Expand Up @@ -99,8 +103,8 @@ class ConfigProtocol {

/* Programming clock managment: This is only applicable to configuration chain
* protocols */
std::map<openfpga::BasicPort, std::vector<size_t>>
prog_clk_ccff_head_indices_;
BasicPort prog_clk_port_;
std::vector<std::vector<size_t>> prog_clk_ccff_head_indices_;
char INDICE_STRING_DELIM_;

/* BL & WL protocol: This is only applicable to memory-bank configuration
Expand Down
14 changes: 13 additions & 1 deletion openfpga/src/fabric/build_top_module.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -595,14 +595,26 @@ int build_top_module(
}
}

/* For configuration chains, we avoid adding nets for programmable clocks if there are a few */
std::vector<std::string> global_port_blacklist;
if (config_protocol.num_prog_clocks() > 1) {
BasicPort prog_clk_port = config_protocol.prog_clock_port_info();
global_port_blacklist.push_back(prog_clk_port.get_name());
/* Add port */
ModulePortId port_id = module_manager.add_port(
module_id, prog_clk_port, ModuleManager::MODULE_GLOBAL_PORT);
/* Add nets by following configurable children under different regions */
add_top_module_nets_prog_clock(module_manager, top_module, port_id, config_protocol);
}

/* Add global ports to the top module:
* This is a much easier job after adding sub modules (instances),
* we just need to find all the global ports from the child modules and build
* a list of it
* @note This function is called after the
* add_top_module_nets_memory_config_bus() because it may add some sub modules
*/
add_module_global_ports_from_child_modules(module_manager, top_module);
add_module_global_ports_from_child_modules(module_manager, top_module, global_port_blacklist);

return status;
}
Expand Down
15 changes: 10 additions & 5 deletions openfpga/src/utils/module_manager_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2185,7 +2185,7 @@ void add_module_gpio_ports_from_child_modules(ModuleManager& module_manager,
* Otherwise, some global ports of the sub modules may be missed!
*******************************************************************/
void add_module_global_input_ports_from_child_modules(
ModuleManager& module_manager, const ModuleId& module_id) {
ModuleManager& module_manager, const ModuleId& module_id, const std::vector<std::string>& port_name_to_ignore) {
std::vector<BasicPort> global_ports_to_add;

/* Iterate over the child modules */
Expand All @@ -2202,8 +2202,12 @@ void add_module_global_input_ports_from_child_modules(
if (it != global_ports_to_add.end()) {
continue;
}
/* Reach here, this is an unique global port, update the list */
global_ports_to_add.push_back(global_port);
/* Reach here, this is an unique global port, update the list
* Final check: ignore those in the blacklist
*/
if (std::find(port_name_to_ignore.begin(), port_name_to_ignore.end(), global_port.get_name()) == port_name_to_ignore.end()) {
global_ports_to_add.push_back(global_port);
}
}
}
}
Expand Down Expand Up @@ -2304,9 +2308,10 @@ void add_module_global_input_ports_from_child_modules(
* Otherwise, some global ports of the sub modules may be missed!
*******************************************************************/
void add_module_global_ports_from_child_modules(ModuleManager& module_manager,
const ModuleId& module_id) {
const ModuleId& module_id,
const std::vector<std::string>& port_name_to_ignore) {
/* Input ports */
add_module_global_input_ports_from_child_modules(module_manager, module_id);
add_module_global_input_ports_from_child_modules(module_manager, module_id, port_name_to_ignore);
}

/********************************************************************
Expand Down
6 changes: 4 additions & 2 deletions openfpga/src/utils/module_manager_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -147,13 +147,15 @@ size_t find_module_num_config_bits(
const e_config_protocol_type& sram_orgz_type);

void add_module_global_input_ports_from_child_modules(
ModuleManager& module_manager, const ModuleId& module_id);
ModuleManager& module_manager, const ModuleId& module_id,
const std::vector<std::string>& port_name_to_ignore = std::vector<std::string>());

void add_module_global_output_ports_from_child_modules(
ModuleManager& module_manager, const ModuleId& module_id);

void add_module_global_ports_from_child_modules(ModuleManager& module_manager,
const ModuleId& module_id);
const ModuleId& module_id,
const std::vector<std::string>& port_name_to_ignore = std::vector<std::string>());

void add_module_gpio_ports_from_child_modules(ModuleManager& module_manager,
const ModuleId& module_id);
Expand Down

0 comments on commit 5500b9a

Please sign in to comment.