[Tool] Add new syntax about physical_pb_port_rotate_offset to support fracturable heterogeneous block mapping between operating modes and physical modes
This commit is contained in:
parent
4f454abfde
commit
148da80869
|
@ -86,11 +86,11 @@ std::vector<std::string> PbTypeAnnotation::port_names() const {
|
|||
return keys;
|
||||
}
|
||||
|
||||
std::map<BasicPort, std::array<int, 2>> PbTypeAnnotation::physical_pb_type_port(const std::string& port_name) const {
|
||||
std::map<std::string, std::map<BasicPort, std::array<int, 2>>>::const_iterator it = operating_pb_type_ports_.find(port_name);
|
||||
std::map<BasicPort, std::array<int, 3>> PbTypeAnnotation::physical_pb_type_port(const std::string& port_name) const {
|
||||
std::map<std::string, std::map<BasicPort, std::array<int, 3>>>::const_iterator it = operating_pb_type_ports_.find(port_name);
|
||||
if (it == operating_pb_type_ports_.end()) {
|
||||
/* Return an empty port */
|
||||
return std::map<BasicPort, std::array<int, 2>>();
|
||||
return std::map<BasicPort, std::array<int, 3>>();
|
||||
}
|
||||
return operating_pb_type_ports_.at(port_name);
|
||||
}
|
||||
|
@ -169,25 +169,25 @@ void PbTypeAnnotation::set_physical_pb_type_index_offset(const int& value) {
|
|||
void PbTypeAnnotation::add_pb_type_port_pair(const std::string& operating_pb_port_name,
|
||||
const BasicPort& physical_pb_port) {
|
||||
/* Give a warning if the operating_pb_port_name already exist */
|
||||
std::map<std::string, std::map<BasicPort, std::array<int, 2>>>::const_iterator it = operating_pb_type_ports_.find(operating_pb_port_name);
|
||||
std::map<std::string, std::map<BasicPort, std::array<int, 3>>>::const_iterator it = operating_pb_type_ports_.find(operating_pb_port_name);
|
||||
|
||||
/* If not exist, initialize and set a default value */
|
||||
if (it == operating_pb_type_ports_.end()) {
|
||||
operating_pb_type_ports_[operating_pb_port_name][physical_pb_port] = {0, 0};
|
||||
operating_pb_type_ports_[operating_pb_port_name][physical_pb_port] = {0, 0, 0};
|
||||
/* We can return early */
|
||||
return;
|
||||
}
|
||||
|
||||
/* If the physical port is not in the list, we create one and set a default value */
|
||||
if (0 == operating_pb_type_ports_[operating_pb_port_name].count(physical_pb_port)) {
|
||||
operating_pb_type_ports_[operating_pb_port_name][physical_pb_port] = {0, 0};
|
||||
operating_pb_type_ports_[operating_pb_port_name][physical_pb_port] = {0, 0, 0};
|
||||
}
|
||||
}
|
||||
|
||||
void PbTypeAnnotation::set_physical_pin_initial_offset(const std::string& operating_pb_port_name,
|
||||
const BasicPort& physical_pb_port,
|
||||
const int& physical_pin_initial_offset) {
|
||||
std::map<std::string, std::map<BasicPort, std::array<int, 2>>>::const_iterator it = operating_pb_type_ports_.find(operating_pb_port_name);
|
||||
std::map<std::string, std::map<BasicPort, std::array<int, 3>>>::const_iterator it = operating_pb_type_ports_.find(operating_pb_port_name);
|
||||
|
||||
if (it == operating_pb_type_ports_.end()) {
|
||||
VTR_LOG_ERROR("The operating pb_type port '%s' is not valid!\n",
|
||||
|
@ -210,7 +210,7 @@ void PbTypeAnnotation::set_physical_pin_initial_offset(const std::string& operat
|
|||
void PbTypeAnnotation::set_physical_pin_rotate_offset(const std::string& operating_pb_port_name,
|
||||
const BasicPort& physical_pb_port,
|
||||
const int& physical_pin_rotate_offset) {
|
||||
std::map<std::string, std::map<BasicPort, std::array<int, 2>>>::const_iterator it = operating_pb_type_ports_.find(operating_pb_port_name);
|
||||
std::map<std::string, std::map<BasicPort, std::array<int, 3>>>::const_iterator it = operating_pb_type_ports_.find(operating_pb_port_name);
|
||||
|
||||
if (it == operating_pb_type_ports_.end()) {
|
||||
VTR_LOG_ERROR("The operating pb_type port '%s' is not valid!\n",
|
||||
|
@ -230,6 +230,30 @@ void PbTypeAnnotation::set_physical_pin_rotate_offset(const std::string& operati
|
|||
operating_pb_type_ports_[operating_pb_port_name][physical_pb_port][1] = physical_pin_rotate_offset;
|
||||
}
|
||||
|
||||
void PbTypeAnnotation::set_physical_port_rotate_offset(const std::string& operating_pb_port_name,
|
||||
const BasicPort& physical_pb_port,
|
||||
const int& physical_port_rotate_offset) {
|
||||
std::map<std::string, std::map<BasicPort, std::array<int, 3>>>::const_iterator it = operating_pb_type_ports_.find(operating_pb_port_name);
|
||||
|
||||
if (it == operating_pb_type_ports_.end()) {
|
||||
VTR_LOG_ERROR("The operating pb_type port '%s' is not valid!\n",
|
||||
operating_pb_port_name.c_str());
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (operating_pb_type_ports_[operating_pb_port_name].end() == operating_pb_type_ports_[operating_pb_port_name].find(physical_pb_port)) {
|
||||
VTR_LOG_ERROR("The physical pb_type port '%s[%lu:%lu]' definition for operating pb_type port '%s' is not valid!\n",
|
||||
physical_pb_port.get_name().c_str(),
|
||||
physical_pb_port.get_lsb(),
|
||||
physical_pb_port.get_msb(),
|
||||
operating_pb_port_name.c_str());
|
||||
exit(1);
|
||||
}
|
||||
|
||||
operating_pb_type_ports_[operating_pb_port_name][physical_pb_port][2] = physical_port_rotate_offset;
|
||||
}
|
||||
|
||||
|
||||
void PbTypeAnnotation::add_interconnect_circuit_model_pair(const std::string& interc_name,
|
||||
const std::string& circuit_model_name) {
|
||||
std::map<std::string, std::string>::const_iterator it = interconnect_circuit_model_names_.find(interc_name);
|
||||
|
|
|
@ -49,7 +49,7 @@ class PbTypeAnnotation {
|
|||
float physical_pb_type_index_factor() const;
|
||||
int physical_pb_type_index_offset() const;
|
||||
std::vector<std::string> port_names() const;
|
||||
std::map<BasicPort, std::array<int, 2>> physical_pb_type_port(const std::string& port_name) const;
|
||||
std::map<BasicPort, std::array<int, 3>> physical_pb_type_port(const std::string& port_name) const;
|
||||
std::vector<std::string> interconnect_names() const;
|
||||
std::string interconnect_circuit_model_name(const std::string& interc_name) const;
|
||||
public: /* Public mutators */
|
||||
|
@ -73,6 +73,9 @@ class PbTypeAnnotation {
|
|||
void set_physical_pin_rotate_offset(const std::string& operating_pb_port_name,
|
||||
const BasicPort& physical_pb_port,
|
||||
const int& physical_pin_rotate_offset);
|
||||
void set_physical_port_rotate_offset(const std::string& operating_pb_port_name,
|
||||
const BasicPort& physical_pb_port,
|
||||
const int& physical_port_rotate_offset);
|
||||
void add_interconnect_circuit_model_pair(const std::string& interc_name,
|
||||
const std::string& circuit_model_name);
|
||||
private: /* Internal data */
|
||||
|
@ -138,10 +141,10 @@ class PbTypeAnnotation {
|
|||
int physical_pb_type_index_offset_;
|
||||
|
||||
/* Link from the pins under an operating pb_type to pairs of
|
||||
* its physical pb_type and its pin initial & rotating offset
|
||||
*
|
||||
* Note that initial offset is the first element of the std::array
|
||||
* Note that rotating offset is the second element of the std::array
|
||||
* its physical pb_type and
|
||||
* - its pin initial offset: the first element of the std::array
|
||||
* - pin-level rotating offset: the second element of the std::array
|
||||
* - port-level rotating offset: the third element of the std::array
|
||||
*
|
||||
* The offsets aim to align the pin indices for port of pb_type
|
||||
* between operating and physical modes, especially when an operating
|
||||
|
@ -158,14 +161,21 @@ class PbTypeAnnotation {
|
|||
* physical pb_type bram[0].dout_a[0] with a full path memory[physical].bram[0]
|
||||
* physical pb_type bram[0].dout_a[1] with a full path memory[physical].bram[0]
|
||||
*
|
||||
* For example, a rotating offset of 9 is used to map
|
||||
* For example, a pin-level rotating offset of 9 is used to map
|
||||
* operating pb_type mult_9x9[0].a[0] with a full path mult[frac].mult_9x9[0]
|
||||
* operating pb_type mult_9x9[0].a[1] with a full path mult[frac].mult_9x9[1]
|
||||
* to
|
||||
* physical pb_type mult_36x36.a[0] with a full path mult[physical].mult_36x36[0]
|
||||
* physical pb_type mult_36x36.a[9] with a full path mult[physical].mult_36x36[0]
|
||||
*
|
||||
* For example, a port-level rotating offset of 9 is used to map
|
||||
* operating pb_type mult_9x9[0].a[0:8] with a full path mult[frac].mult_9x9[0]
|
||||
* operating pb_type mult_9x9[1].a[0:8] with a full path mult[frac].mult_9x9[1]
|
||||
* to
|
||||
* physical pb_type mult_36x36.a[0:8] with a full path mult[physical].mult_36x36[0]
|
||||
* physical pb_type mult_36x36.a[9:17] with a full path mult[physical].mult_36x36[0]
|
||||
*/
|
||||
std::map<std::string, std::map<BasicPort, std::array<int, 2>>> operating_pb_type_ports_;
|
||||
std::map<std::string, std::map<BasicPort, std::array<int, 3>>> operating_pb_type_ports_;
|
||||
|
||||
/* Link between the interconnects under this pb_type and circuit model names */
|
||||
std::map<std::string, std::string> interconnect_circuit_model_names_;
|
||||
|
|
|
@ -114,6 +114,31 @@ void read_xml_pb_port_annotation(pugi::xml_node& xml_port,
|
|||
std::stoi(rotate_offsets[iport]));
|
||||
}
|
||||
}
|
||||
|
||||
/* We have an optional attribute: physical_mode_port_rotate_offset
|
||||
* Split based on the number of physical pb_type ports that have been defined
|
||||
*/
|
||||
const std::string& physical_port_rotate_offset_attr = get_attribute(xml_port, "physical_mode_port_rotate_offset", loc_data, pugiutil::ReqOpt::OPTIONAL).as_string();
|
||||
|
||||
if (false == physical_port_rotate_offset_attr.empty()) {
|
||||
/* Split the physical mode port attributes with space */
|
||||
openfpga::StringToken offset_tokenizer(physical_port_rotate_offset_attr);
|
||||
const std::vector<std::string> rotate_offsets = offset_tokenizer.split();
|
||||
|
||||
/* Error out if the offset does not match the port definition */
|
||||
if (physical_mode_ports.size() != rotate_offsets.size()) {
|
||||
archfpga_throw(loc_data.filename_c_str(), loc_data.line(xml_port),
|
||||
"Defined %lu physical mode ports but only %lu physical port rotate offset are defined! Expect size matching.\n",
|
||||
physical_mode_ports.size(), rotate_offsets.size());
|
||||
}
|
||||
|
||||
for (size_t iport = 0; iport < physical_mode_ports.size(); ++iport) {
|
||||
openfpga::PortParser port_parser(physical_mode_ports[iport]);
|
||||
pb_type_annotation.set_physical_port_rotate_offset(name_attr,
|
||||
port_parser.port(),
|
||||
std::stoi(rotate_offsets[iport]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/********************************************************************
|
||||
|
|
|
@ -144,7 +144,14 @@ void write_xml_pb_port_annotation(std::fstream& fp,
|
|||
physical_mode_pin_rotate_offset_attr += std::to_string(physical_pb_port_pair.second[1]);
|
||||
}
|
||||
write_xml_attribute(fp, "physical_mode_pin_rotate_offset", physical_mode_pin_rotate_offset_attr.c_str());
|
||||
|
||||
std::string physical_mode_port_rotate_offset_attr;
|
||||
for (const auto& physical_pb_port_pair : pb_type_annotation.physical_pb_type_port(port_name)) {
|
||||
if (false == physical_mode_port_rotate_offset_attr.empty()) {
|
||||
physical_mode_port_rotate_offset_attr += " ";
|
||||
}
|
||||
physical_mode_port_rotate_offset_attr += std::to_string(physical_pb_port_pair.second[2]);
|
||||
}
|
||||
write_xml_attribute(fp, "physical_mode_port_rotate_offset", physical_mode_port_rotate_offset_attr.c_str());
|
||||
fp << "/>" << "\n";
|
||||
}
|
||||
|
||||
|
|
|
@ -333,7 +333,7 @@ bool try_match_pb_graph_pin(t_pb_graph_pin* operating_pb_graph_pin,
|
|||
* by the pin rotate offset value
|
||||
* The accumulated offset will be reset to 0 when it exceeds the msb() of the physical port
|
||||
*/
|
||||
int acc_offset = vpr_device_annotation.physical_pb_pin_offset(operating_pb_graph_pin->port, candidate_port);
|
||||
int acc_offset = vpr_device_annotation.physical_pb_pin_offset(operating_pb_graph_pin->port, candidate_port) + vpr_device_annotation.physical_pb_port_offset(operating_pb_graph_pin->port, candidate_port);
|
||||
int init_offset = vpr_device_annotation.physical_pb_pin_initial_offset(operating_pb_graph_pin->port, candidate_port);
|
||||
const BasicPort& physical_port_range = vpr_device_annotation.physical_pb_port_range(operating_pb_graph_pin->port, candidate_port);
|
||||
if (physical_pb_graph_pin->pin_number != operating_pb_graph_pin->pin_number
|
||||
|
@ -463,6 +463,14 @@ void annotate_physical_pb_graph_node_pins(t_pb_graph_node* operating_pb_graph_no
|
|||
physical_pb_graph_node, vpr_device_annotation,
|
||||
verbose_output);
|
||||
}
|
||||
/* Finish a port, accumulate the port-level offset affiliated to the port */
|
||||
if (0 == operating_pb_graph_node->num_input_pins[iport]) {
|
||||
continue;
|
||||
}
|
||||
t_pb_graph_pin* operating_pb_graph_pin = &(operating_pb_graph_node->input_pins[iport][0]);
|
||||
for (t_port* candidate_port : vpr_device_annotation.physical_pb_port(operating_pb_graph_pin->port)) {
|
||||
vpr_device_annotation.accumulate_physical_pb_port_rotate_offset(operating_pb_graph_pin->port, candidate_port);
|
||||
}
|
||||
}
|
||||
|
||||
for (int iport = 0; iport < operating_pb_graph_node->num_output_ports; ++iport) {
|
||||
|
@ -471,6 +479,14 @@ void annotate_physical_pb_graph_node_pins(t_pb_graph_node* operating_pb_graph_no
|
|||
physical_pb_graph_node, vpr_device_annotation,
|
||||
verbose_output);
|
||||
}
|
||||
/* Finish a port, accumulate the port-level offset affiliated to the port */
|
||||
if (0 == operating_pb_graph_node->num_output_pins[iport]) {
|
||||
continue;
|
||||
}
|
||||
t_pb_graph_pin* operating_pb_graph_pin = &(operating_pb_graph_node->output_pins[iport][0]);
|
||||
for (t_port* candidate_port : vpr_device_annotation.physical_pb_port(operating_pb_graph_pin->port)) {
|
||||
vpr_device_annotation.accumulate_physical_pb_port_rotate_offset(operating_pb_graph_pin->port, candidate_port);
|
||||
}
|
||||
}
|
||||
|
||||
for (int iport = 0; iport < operating_pb_graph_node->num_clock_ports; ++iport) {
|
||||
|
@ -479,6 +495,14 @@ void annotate_physical_pb_graph_node_pins(t_pb_graph_node* operating_pb_graph_no
|
|||
physical_pb_graph_node, vpr_device_annotation,
|
||||
verbose_output);
|
||||
}
|
||||
/* Finish a port, accumulate the port-level offset affiliated to the port */
|
||||
if (0 == operating_pb_graph_node->num_clock_pins[iport]) {
|
||||
continue;
|
||||
}
|
||||
t_pb_graph_pin* operating_pb_graph_pin = &(operating_pb_graph_node->clock_pins[iport][0]);
|
||||
for (t_port* candidate_port : vpr_device_annotation.physical_pb_port(operating_pb_graph_pin->port)) {
|
||||
vpr_device_annotation.accumulate_physical_pb_port_rotate_offset(operating_pb_graph_pin->port, candidate_port);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -211,7 +211,7 @@ bool pair_operating_and_physical_pb_types(t_pb_type* operating_pb_type,
|
|||
* if not found, we assume that the physical port is the same as the operating pb_port
|
||||
*/
|
||||
for (t_port* operating_pb_port : pb_type_ports(operating_pb_type)) {
|
||||
std::map<BasicPort, std::array<int, 2>> expected_physical_pb_ports = pb_type_annotation.physical_pb_type_port(std::string(operating_pb_port->name));
|
||||
std::map<BasicPort, std::array<int, 3>> expected_physical_pb_ports = pb_type_annotation.physical_pb_type_port(std::string(operating_pb_port->name));
|
||||
|
||||
/* If not defined in the annotation, set the default pair:
|
||||
* rotate_offset is 0 by default!
|
||||
|
@ -243,6 +243,7 @@ bool pair_operating_and_physical_pb_types(t_pb_type* operating_pb_type,
|
|||
vpr_device_annotation.add_physical_pb_port_range(operating_pb_port, physical_pb_port, expected_physical_pb_port.first);
|
||||
vpr_device_annotation.add_physical_pb_pin_initial_offset(operating_pb_port, physical_pb_port, expected_physical_pb_port.second[0]);
|
||||
vpr_device_annotation.add_physical_pb_pin_rotate_offset(operating_pb_port, physical_pb_port, expected_physical_pb_port.second[1]);
|
||||
vpr_device_annotation.add_physical_pb_port_rotate_offset(operating_pb_port, physical_pb_port, expected_physical_pb_port.second[2]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -220,6 +220,21 @@ int VprDeviceAnnotation::physical_pb_pin_rotate_offset(t_port* operating_pb_port
|
|||
return physical_pb_pin_rotate_offsets_.at(operating_pb_port).at(physical_pb_port);
|
||||
}
|
||||
|
||||
int VprDeviceAnnotation::physical_pb_port_rotate_offset(t_port* operating_pb_port,
|
||||
t_port* physical_pb_port) const {
|
||||
/* Ensure that the pb_type is in the list */
|
||||
std::map<t_port*, std::map<t_port*, int>>::const_iterator it = physical_pb_port_rotate_offsets_.find(operating_pb_port);
|
||||
if (it == physical_pb_port_rotate_offsets_.end()) {
|
||||
/* Default value is 0 */
|
||||
return 0;
|
||||
}
|
||||
if (0 == physical_pb_port_rotate_offsets_.at(operating_pb_port).count(physical_pb_port)) {
|
||||
/* Default value is 0 */
|
||||
return 0;
|
||||
}
|
||||
return physical_pb_port_rotate_offsets_.at(operating_pb_port).at(physical_pb_port);
|
||||
}
|
||||
|
||||
int VprDeviceAnnotation::physical_pb_pin_offset(t_port* operating_pb_port,
|
||||
t_port* physical_pb_port) const {
|
||||
/* Ensure that the pb_type is in the list */
|
||||
|
@ -235,6 +250,21 @@ int VprDeviceAnnotation::physical_pb_pin_offset(t_port* operating_pb_port,
|
|||
return physical_pb_pin_offsets_.at(operating_pb_port).at(physical_pb_port);
|
||||
}
|
||||
|
||||
int VprDeviceAnnotation::physical_pb_port_offset(t_port* operating_pb_port,
|
||||
t_port* physical_pb_port) const {
|
||||
/* Ensure that the pb_type is in the list */
|
||||
std::map<t_port*, std::map<t_port*, int>>::const_iterator it = physical_pb_port_offsets_.find(operating_pb_port);
|
||||
if (it == physical_pb_port_offsets_.end()) {
|
||||
/* Default value is 0 */
|
||||
return 0;
|
||||
}
|
||||
if (0 == physical_pb_port_offsets_.at(operating_pb_port).count(physical_pb_port)) {
|
||||
/* Default value is 0 */
|
||||
return 0;
|
||||
}
|
||||
return physical_pb_port_offsets_.at(operating_pb_port).at(physical_pb_port);
|
||||
}
|
||||
|
||||
t_pb_graph_pin* VprDeviceAnnotation::physical_pb_graph_pin(const t_pb_graph_pin* pb_graph_pin) const {
|
||||
/* Ensure that the pb_type is in the list */
|
||||
std::map<const t_pb_graph_pin*, t_pb_graph_pin*>::const_iterator it = physical_pb_graph_pins_.find(pb_graph_pin);
|
||||
|
@ -478,6 +508,28 @@ void VprDeviceAnnotation::add_physical_pb_pin_initial_offset(t_port* operating_p
|
|||
physical_pb_pin_initial_offsets_[operating_pb_port][physical_pb_port] = offset;
|
||||
}
|
||||
|
||||
void VprDeviceAnnotation::add_physical_pb_port_rotate_offset(t_port* operating_pb_port,
|
||||
t_port* physical_pb_port,
|
||||
const int& offset) {
|
||||
/* Warn any override attempt */
|
||||
std::map<t_port*, std::map<t_port*, int>>::const_iterator it = physical_pb_port_rotate_offsets_.find(operating_pb_port);
|
||||
if ( (it != physical_pb_port_rotate_offsets_.end())
|
||||
&& (0 < physical_pb_port_rotate_offsets_[operating_pb_port].count(physical_pb_port)) ) {
|
||||
VTR_LOG_WARN("Override the annotation between operating pb_port '%s' and it physical pb_port '%s' port rotate offset '%d'!\n",
|
||||
operating_pb_port->name, offset);
|
||||
}
|
||||
|
||||
physical_pb_port_rotate_offsets_[operating_pb_port][physical_pb_port] = offset;
|
||||
/* We initialize the accumulated offset to 0 */
|
||||
physical_pb_port_offsets_[operating_pb_port][physical_pb_port] = 0;
|
||||
}
|
||||
|
||||
|
||||
void VprDeviceAnnotation::accumulate_physical_pb_port_rotate_offset(t_port* operating_pb_port,
|
||||
t_port* physical_pb_port) {
|
||||
physical_pb_port_offsets_[operating_pb_port][physical_pb_port] += physical_pb_port_rotate_offsets_[operating_pb_port][physical_pb_port];
|
||||
}
|
||||
|
||||
void VprDeviceAnnotation::add_physical_pb_pin_rotate_offset(t_port* operating_pb_port,
|
||||
t_port* physical_pb_port,
|
||||
const int& offset) {
|
||||
|
|
|
@ -67,6 +67,9 @@ class VprDeviceAnnotation {
|
|||
int physical_pb_pin_rotate_offset(t_port* operating_pb_port,
|
||||
t_port* physical_pb_port) const;
|
||||
|
||||
int physical_pb_port_rotate_offset(t_port* operating_pb_port,
|
||||
t_port* physical_pb_port) const;
|
||||
|
||||
/**This function returns an accumulated offset. Note that the
|
||||
* accumulated offset is NOT the pin rotate offset specified by users
|
||||
* It is an aggregation of the offset during pin pairing
|
||||
|
@ -76,6 +79,8 @@ class VprDeviceAnnotation {
|
|||
*/
|
||||
int physical_pb_pin_offset(t_port* operating_pb_port,
|
||||
t_port* physical_pb_port) const;
|
||||
int physical_pb_port_offset(t_port* operating_pb_port,
|
||||
t_port* physical_pb_port) const;
|
||||
t_pb_graph_pin* physical_pb_graph_pin(const t_pb_graph_pin* pb_graph_pin) const;
|
||||
CircuitModelId rr_switch_circuit_model(const RRSwitchId& rr_switch) const;
|
||||
CircuitModelId rr_segment_circuit_model(const RRSegmentId& rr_segment) const;
|
||||
|
@ -106,6 +111,11 @@ class VprDeviceAnnotation {
|
|||
void add_physical_pb_pin_initial_offset(t_port* operating_pb_port,
|
||||
t_port* physical_pb_port,
|
||||
const int& offset);
|
||||
void add_physical_pb_port_rotate_offset(t_port* operating_pb_port,
|
||||
t_port* physical_pb_port,
|
||||
const int& offset);
|
||||
void accumulate_physical_pb_port_rotate_offset(t_port* operating_pb_port,
|
||||
t_port* physical_pb_port);
|
||||
void add_physical_pb_pin_rotate_offset(t_port* operating_pb_port,
|
||||
t_port* physical_pb_port,
|
||||
const int& offset);
|
||||
|
@ -166,8 +176,11 @@ class VprDeviceAnnotation {
|
|||
std::map<t_port*, std::vector<t_port*>> physical_pb_ports_;
|
||||
std::map<t_port*, std::map<t_port*, int>> physical_pb_pin_initial_offsets_;
|
||||
std::map<t_port*, std::map<t_port*, int>> physical_pb_pin_rotate_offsets_;
|
||||
std::map<t_port*, std::map<t_port*, int>> physical_pb_port_rotate_offsets_;
|
||||
|
||||
/* Accumulated offsets for a physical pb_type port, just for internal usage */
|
||||
/* Accumulated offsets for a physical pb port, just for internal usage */
|
||||
std::map<t_port*, std::map<t_port*, int>> physical_pb_port_offsets_;
|
||||
/* Accumulated offsets for a physical pb_graph_pin, just for internal usage */
|
||||
std::map<t_port*, std::map<t_port*, int>> physical_pb_pin_offsets_;
|
||||
|
||||
/* Pair a pb_port to its LSB and MSB of a physical pb_port
|
||||
|
|
|
@ -61,9 +61,9 @@ bool rec_direct_search_sink_pb_graph_pins(const t_pb_graph_pin* source_pb_pin,
|
|||
std::vector<t_pb_graph_pin*> sink_pb_pins_to_search;
|
||||
|
||||
/* Only support single-mode pb_type!!! */
|
||||
if (1 != source_pb_pin->parent_node->pb_type->num_modes) {
|
||||
return false;
|
||||
}
|
||||
//if (1 != source_pb_pin->parent_node->pb_type->num_modes) {
|
||||
// return false;
|
||||
//}
|
||||
|
||||
for (int iedge = 0; iedge < source_pb_pin->num_output_edges; ++iedge) {
|
||||
if (DIRECT_INTERC != source_pb_pin->output_edges[iedge]->interconnect->type) {
|
||||
|
|
Loading…
Reference in New Issue