[lib] developing io pin table data structure

This commit is contained in:
tangxifan 2022-07-26 20:47:45 -07:00
parent 5fa2df1d27
commit b8bd19a234
3 changed files with 82 additions and 4 deletions

View File

@ -20,6 +20,7 @@ set_target_properties(libpcf PROPERTIES PREFIX "") #Avoid extra 'lib' prefix
#Specify link-time dependancies
target_link_libraries(libpcf
libopenfpgautil
libarchfpga
libarchopenfpga
libvtrutil
libpugixml

View File

@ -0,0 +1,74 @@
#include <algorithm>
#include "vtr_assert.h"
#include "vtr_log.h"
#include "io_pin_table.h"
/* begin namespace openfpga */
namespace openfpga {
/************************************************************************
* Member functions for class IoPinTable
***********************************************************************/
/************************************************************************
* Constructors
***********************************************************************/
IoPinTable::IoPinTable() {
return;
}
/************************************************************************
* Public Accessors : aggregates
***********************************************************************/
IoPinTable::io_pin_table_range IoPinTable::internal_pins() const {
return vtr::make_range(pin_ids_.begin(), pin_ids_.end());
}
/************************************************************************
* Public Accessors : Basic data query
***********************************************************************/
openfpga::BasicPort IoPinTable::internal_pin(const IoPinTableId& pin_id) const {
/* validate the pin_id */
VTR_ASSERT(valid_pin_id(pin_id));
return internal_pins_[pin_id];
}
bool IoPinTable::empty() const {
return 0 == pin_ids_.size();
}
/************************************************************************
* Public Mutators
***********************************************************************/
void IoPinTable::reserve_pins(const size_t& num_pins) {
pin_ids_.reserve(num_pins);
internal_pins_.reserve(num_pins);
external_pins_.reserve(num_pins);
pin_sides_.reserve(num_pins);
pin_directions_.reserve(num_pins);
}
IoPinTableId IoPinTable::create_pin() {
/* Create a new id */
IoPinTableId pin_id = IoPinTableId(pin_ids_.size());
pin_ids_.push_back(pin_id);
internal_pins_.emplace_back();
external_pins_.emplace_back();
pin_sides_.emplace_back(NUM_SIDES);
pin_directions_.emplace_back(NUM_IO_DIRECTIONS);
return pin_id;
}
/************************************************************************
* Internal invalidators/validators
***********************************************************************/
/* Validators */
bool IoPinTable::valid_pin_id(const IoPinTableId& pin_id) const {
return ( size_t(pin_id) < pin_ids_.size() ) && ( pin_id == pin_ids_[pin_id] );
}
} /* end namespace openfpga */

View File

@ -12,6 +12,9 @@
#include "vtr_vector.h"
#include "vtr_geometry.h"
/* Headers from libarchfpga library */
#include "physical_types.h"
/* Headers from openfpgautil library */
#include "openfpga_port.h"
@ -62,7 +65,7 @@ class IoPinTable {
NUM_IO_DIRECTIONS
};
public: /* Constructors */
IoPinTables();
IoPinTable();
public: /* Accessors: aggregates */
/* Walk through the internal pins. We do not walk through external pins because they are not unique in the table.
* An external pin may be accessible by two internal pins
@ -79,8 +82,8 @@ class IoPinTable {
/* Reserve to be memory efficent */
void reserve_pins(const size_t& num_pins);
/* Add a pin constraint to storage */
IoPinTableId create_pin(const openfpga::BasicPort& pin);
/* Add a pin to storage */
IoPinTableId create_pin();
public: /* Public invalidators/validators */
/* Show if the pin id is a valid for data queries */
@ -93,7 +96,7 @@ class IoPinTable {
vtr::vector<IoPinTableId, BasicPort> internal_pins_;
vtr::vector<IoPinTableId, BasicPort> external_pins_;
vtr::vector<IoPinTableId, e_side> pin_sides_;
vtr::vector<IoPinTableId, e_io_direction> pin_drections_;
vtr::vector<IoPinTableId, e_io_direction> pin_directions_;
};
} /* end namespace openfpga */