[lib] now clock arch supports tap points
This commit is contained in:
parent
3a40c5e15f
commit
9f20d2e639
|
@ -230,6 +230,11 @@ vtr::Point<int> ClockNetwork::spine_switch_point(
|
||||||
return spine_switch_coords_[spine_id][size_t(switch_point_id)];
|
return spine_switch_coords_[spine_id][size_t(switch_point_id)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> ClockNetwork::spine_taps(const ClockSpineId& spine_id) const {
|
||||||
|
VTR_ASSERT(valid_spine_id(spine_id));
|
||||||
|
return spine_taps_[spine_id];
|
||||||
|
}
|
||||||
|
|
||||||
ClockSpineId ClockNetwork::find_spine(const std::string& name) const {
|
ClockSpineId ClockNetwork::find_spine(const std::string& name) const {
|
||||||
auto result = spine_name2id_map_.find(name);
|
auto result = spine_name2id_map_.find(name);
|
||||||
if (result == spine_name2id_map_.end()) {
|
if (result == spine_name2id_map_.end()) {
|
||||||
|
@ -332,6 +337,7 @@ ClockSpineId ClockNetwork::create_spine(const std::string& name) {
|
||||||
spine_parents_.emplace_back();
|
spine_parents_.emplace_back();
|
||||||
spine_children_.emplace_back();
|
spine_children_.emplace_back();
|
||||||
spine_parent_trees_.emplace_back();
|
spine_parent_trees_.emplace_back();
|
||||||
|
spine_taps_.emplace_back();
|
||||||
|
|
||||||
/* Register to the lookup */
|
/* Register to the lookup */
|
||||||
VTR_ASSERT(valid_spine_id(spine_id));
|
VTR_ASSERT(valid_spine_id(spine_id));
|
||||||
|
@ -388,6 +394,11 @@ void ClockNetwork::add_spine_switch_point(const ClockSpineId& spine_id,
|
||||||
spine_children_[spine_id].push_back(drive_spine_id);
|
spine_children_[spine_id].push_back(drive_spine_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ClockNetwork::add_spine_tap(const ClockSpineId& spine_id, const std::string& pin_name) {
|
||||||
|
VTR_ASSERT(valid_spine_id(spine_id));
|
||||||
|
spine_taps_.push_back(pin_name);
|
||||||
|
}
|
||||||
|
|
||||||
bool ClockNetwork::link() {
|
bool ClockNetwork::link() {
|
||||||
for (ClockTreeId tree_id : trees()) {
|
for (ClockTreeId tree_id : trees()) {
|
||||||
if (!link_tree(tree_id)) {
|
if (!link_tree(tree_id)) {
|
||||||
|
|
|
@ -104,6 +104,7 @@ class ClockNetwork {
|
||||||
vtr::Point<int> spine_switch_point(
|
vtr::Point<int> spine_switch_point(
|
||||||
const ClockSpineId& spine_id,
|
const ClockSpineId& spine_id,
|
||||||
const ClockSwitchPointId& switch_point_id) const;
|
const ClockSwitchPointId& switch_point_id) const;
|
||||||
|
std::vector<std::string> spine_taps(const ClockSpineId& spine_id) const;
|
||||||
/* Find a spine with a given name, if not found, return an valid id, otherwise
|
/* Find a spine with a given name, if not found, return an valid id, otherwise
|
||||||
* return an invalid one */
|
* return an invalid one */
|
||||||
ClockSpineId find_spine(const std::string& name) const;
|
ClockSpineId find_spine(const std::string& name) const;
|
||||||
|
@ -146,6 +147,7 @@ class ClockNetwork {
|
||||||
void add_spine_switch_point(const ClockSpineId& spine_id,
|
void add_spine_switch_point(const ClockSpineId& spine_id,
|
||||||
const ClockSpineId& drive_spine_id,
|
const ClockSpineId& drive_spine_id,
|
||||||
const vtr::Point<int>& coord);
|
const vtr::Point<int>& coord);
|
||||||
|
void add_spine_tap(const ClockSpineId& spine_id, const std::string& pin_name);
|
||||||
/* Build internal links between clock tree, spines etc. This is also an
|
/* Build internal links between clock tree, spines etc. This is also an
|
||||||
* validator to verify the correctness of the clock network. Must run before
|
* validator to verify the correctness of the clock network. Must run before
|
||||||
* using the data! */
|
* using the data! */
|
||||||
|
@ -201,6 +203,7 @@ class ClockNetwork {
|
||||||
vtr::vector<ClockSpineId, size_t> spine_levels_;
|
vtr::vector<ClockSpineId, size_t> spine_levels_;
|
||||||
vtr::vector<ClockSpineId, vtr::Point<int>> spine_start_points_;
|
vtr::vector<ClockSpineId, vtr::Point<int>> spine_start_points_;
|
||||||
vtr::vector<ClockSpineId, vtr::Point<int>> spine_end_points_;
|
vtr::vector<ClockSpineId, vtr::Point<int>> spine_end_points_;
|
||||||
|
vtr::vector<ClockSpineId, std::vector<std::string>> spine_taps_;
|
||||||
vtr::vector<ClockSpineId, std::vector<ClockSpineId>> spine_switch_points_;
|
vtr::vector<ClockSpineId, std::vector<ClockSpineId>> spine_switch_points_;
|
||||||
vtr::vector<ClockSpineId, std::vector<vtr::Point<int>>> spine_switch_coords_;
|
vtr::vector<ClockSpineId, std::vector<vtr::Point<int>>> spine_switch_coords_;
|
||||||
vtr::vector<ClockSpineId, ClockSpineId> spine_parents_;
|
vtr::vector<ClockSpineId, ClockSpineId> spine_parents_;
|
||||||
|
|
|
@ -21,5 +21,7 @@ constexpr const char* XML_CLOCK_SPINE_SWITCH_POINT_NODE_NAME = "switch_point";
|
||||||
constexpr const char* XML_CLOCK_SPINE_SWITCH_POINT_ATTRIBUTE_TAP = "tap";
|
constexpr const char* XML_CLOCK_SPINE_SWITCH_POINT_ATTRIBUTE_TAP = "tap";
|
||||||
constexpr const char* XML_CLOCK_SPINE_SWITCH_POINT_ATTRIBUTE_X = "x";
|
constexpr const char* XML_CLOCK_SPINE_SWITCH_POINT_ATTRIBUTE_X = "x";
|
||||||
constexpr const char* XML_CLOCK_SPINE_SWITCH_POINT_ATTRIBUTE_Y = "y";
|
constexpr const char* XML_CLOCK_SPINE_SWITCH_POINT_ATTRIBUTE_Y = "y";
|
||||||
|
constexpr const char* XML_CLOCK_SPINE_TAP_NODE_NAME = "tap";
|
||||||
|
constexpr const char* XML_CLOCK_SPINE_TAP_ATTRIBUTE_TILE_PIN = "tile_pin";
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -24,6 +24,24 @@
|
||||||
|
|
||||||
namespace openfpga { // Begin namespace openfpga
|
namespace openfpga { // Begin namespace openfpga
|
||||||
|
|
||||||
|
/********************************************************************
|
||||||
|
* Parse XML codes of a <tap> to an object of ClockNetwork
|
||||||
|
*******************************************************************/
|
||||||
|
static void read_xml_clock_spine_tap(
|
||||||
|
pugi::xml_node& xml_switch_point, const pugiutil::loc_data& loc_data,
|
||||||
|
ClockNetwork& clk_ntwk, const ClockSpineId& spine_id) {
|
||||||
|
if (!clk_ntwk.valid_spine_id(spine_id)) {
|
||||||
|
archfpga_throw(loc_data.filename_c_str(), loc_data.line(xml_switch_point),
|
||||||
|
"Invalid id of a clock spine!\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string tile_pin_name =
|
||||||
|
get_attribute(xml_switch_point, XML_CLOCK_SPINE_TAP_ATTRIBUTE_TILE_PIN,
|
||||||
|
loc_data)
|
||||||
|
.as_string();
|
||||||
|
clk_ntwk.add_spine_tap(spine_id, tile_pin_name);
|
||||||
|
}
|
||||||
|
|
||||||
/********************************************************************
|
/********************************************************************
|
||||||
* Parse XML codes of a <switch_point> to an object of ClockNetwork
|
* Parse XML codes of a <switch_point> to an object of ClockNetwork
|
||||||
*******************************************************************/
|
*******************************************************************/
|
||||||
|
@ -109,13 +127,17 @@ static void read_xml_clock_spine(pugi::xml_node& xml_spine,
|
||||||
|
|
||||||
for (pugi::xml_node xml_switch_point : xml_spine.children()) {
|
for (pugi::xml_node xml_switch_point : xml_spine.children()) {
|
||||||
/* Error out if the XML child has an invalid name! */
|
/* Error out if the XML child has an invalid name! */
|
||||||
if (xml_switch_point.name() !=
|
if (xml_switch_point.name() ==
|
||||||
std::string(XML_CLOCK_SPINE_SWITCH_POINT_NODE_NAME)) {
|
std::string(XML_CLOCK_SPINE_SWITCH_POINT_NODE_NAME)) {
|
||||||
|
read_xml_clock_spine_switch_point(xml_switch_point, loc_data, clk_ntwk,
|
||||||
|
spine_id);
|
||||||
|
} else if (xml_switch_point.name() ==
|
||||||
|
std::string(XML_CLOCK_SPINE_TAP_NODE_NAME)) {
|
||||||
|
read_xml_clock_spine_tap(xml_switch_point, loc_data, clk_ntwk, spine_id);
|
||||||
|
} else {
|
||||||
bad_tag(xml_switch_point, loc_data, xml_spine,
|
bad_tag(xml_switch_point, loc_data, xml_spine,
|
||||||
{XML_CLOCK_SPINE_SWITCH_POINT_NODE_NAME});
|
{XML_CLOCK_SPINE_SWITCH_POINT_NODE_NAME, XML_CLOCK_SPINE_TAP_NODE_NAME});
|
||||||
}
|
}
|
||||||
read_xml_clock_spine_switch_point(xml_switch_point, loc_data, clk_ntwk,
|
|
||||||
spine_id);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,22 @@
|
||||||
|
|
||||||
namespace openfpga { // Begin namespace openfpga
|
namespace openfpga { // Begin namespace openfpga
|
||||||
|
|
||||||
|
static int write_xml_clock_spine_taps(
|
||||||
|
std::fstream& fp, const ClockNetwork& clk_ntwk, const ClockSpineId& spine_id) {
|
||||||
|
for (const std::string& tile_pin_name : clk_ntwk.spine_taps(spine_id)) {
|
||||||
|
openfpga::write_tab_to_file(fp, 3);
|
||||||
|
fp << "<" << XML_CLOCK_SPINE_TAP_NODE_NAME << "";
|
||||||
|
|
||||||
|
write_xml_attribute(
|
||||||
|
fp, XML_CLOCK_SPINE_TAP_ATTRIBUTE_TILE_PIN,
|
||||||
|
tile_pin_name.c_str());
|
||||||
|
fp << "/>"
|
||||||
|
<< "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int write_xml_clock_spine_switch_point(
|
static int write_xml_clock_spine_switch_point(
|
||||||
std::fstream& fp, const ClockNetwork& clk_ntwk, const ClockSpineId& spine_id,
|
std::fstream& fp, const ClockNetwork& clk_ntwk, const ClockSpineId& spine_id,
|
||||||
const ClockSwitchPointId& switch_point_id) {
|
const ClockSwitchPointId& switch_point_id) {
|
||||||
|
@ -66,6 +82,7 @@ static int write_xml_clock_spine(std::fstream& fp, const ClockNetwork& clk_ntwk,
|
||||||
clk_ntwk.spine_switch_points(spine_id)) {
|
clk_ntwk.spine_switch_points(spine_id)) {
|
||||||
write_xml_clock_spine_switch_point(fp, clk_ntwk, spine_id, switch_point_id);
|
write_xml_clock_spine_switch_point(fp, clk_ntwk, spine_id, switch_point_id);
|
||||||
}
|
}
|
||||||
|
write_xml_clock_spine_taps(fp, clk_ntwk, spine_id);
|
||||||
|
|
||||||
openfpga::write_tab_to_file(fp, 2);
|
openfpga::write_tab_to_file(fp, 2);
|
||||||
fp << "</" << XML_CLOCK_SPINE_NODE_NAME << "";
|
fp << "</" << XML_CLOCK_SPINE_NODE_NAME << "";
|
||||||
|
|
Loading…
Reference in New Issue