[lib] developing pcf data structure
This commit is contained in:
parent
079a502153
commit
73c0349832
|
@ -0,0 +1,91 @@
|
|||
#include <algorithm>
|
||||
|
||||
#include "vtr_assert.h"
|
||||
#include "vtr_log.h"
|
||||
|
||||
#include "openfpga_port_parser.h"
|
||||
#include "pcf_data.h"
|
||||
|
||||
/* Begin namespace openfpga */
|
||||
namespace openfpga {
|
||||
|
||||
/************************************************************************
|
||||
* Member functions for class PcfData
|
||||
***********************************************************************/
|
||||
|
||||
/************************************************************************
|
||||
* Constructors
|
||||
***********************************************************************/
|
||||
PcfData::PcfData() {
|
||||
return;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Public Accessors : aggregates
|
||||
***********************************************************************/
|
||||
PcfData::pcf_io_constraint_range PcfData::io_constraints() const {
|
||||
return vtr::make_range(io_constraint_ids_.begin(), io_constraint_ids_.end());
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Public Accessors : Basic data query
|
||||
***********************************************************************/
|
||||
openfpga::BasicPort PcfData::io_pin(const PcfIoConstraintId& io_id) const {
|
||||
/* validate the io_id */
|
||||
VTR_ASSERT(valid_io_constraint_id(io_id));
|
||||
return io_constraint_pins_[io_id];
|
||||
}
|
||||
|
||||
std::string PcfData::io_net(const PcfIoConstraintId& io_id) const {
|
||||
/* validate the io_id */
|
||||
VTR_ASSERT(valid_io_constraint_id(io_id));
|
||||
return io_constraint_nets_[io_id];
|
||||
}
|
||||
|
||||
bool PcfData::empty() const {
|
||||
return 0 == io_constraint_ids_.size();
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Public Mutators
|
||||
***********************************************************************/
|
||||
void PcfData::reserve_io_constraints(const size_t& num_io_constraints) {
|
||||
io_constraint_ids_.reserve(num_io_constraints);
|
||||
io_constraint_pins_.reserve(num_io_constraints);
|
||||
io_constraint_nets_.reserve(num_io_constraints);
|
||||
}
|
||||
|
||||
PcfIoConstraintId PcfData::create_io_constraint() {
|
||||
/* Create a new id */
|
||||
PcfIoConstraintId io_id = PcfIoConstraintId(io_constraint_ids_.size());
|
||||
|
||||
io_constraint_ids_.push_back(io_id);
|
||||
io_constraint_pins_.emplace_back();
|
||||
io_constraint_nets_.emplace_back();
|
||||
|
||||
return io_id;
|
||||
}
|
||||
|
||||
void PcfData::set_io_net(const PcfIoConstraintId& io_id,
|
||||
const std::string& net) {
|
||||
VTR_ASSERT(valid_io_constraint_id(io_id));
|
||||
io_constraint_nets_[io_id] = net;
|
||||
}
|
||||
|
||||
void PcfData::set_io_pin(const PcfIoConstraintId& io_id,
|
||||
const std::string& pin) {
|
||||
VTR_ASSERT(valid_io_constraint_id(io_id));
|
||||
PortParser port_parser(pin);
|
||||
io_constraint_pins_[io_id] = port_parser.port();
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
* Internal invalidators/validators
|
||||
***********************************************************************/
|
||||
/* Validators */
|
||||
bool PcfData::valid_io_constraint_id(const PcfIoConstraintId& io_id) const {
|
||||
return ( size_t(io_id) < io_constraint_ids_.size() ) && ( io_id == io_constraint_ids_[io_id] );
|
||||
}
|
||||
|
||||
} /* End namespace openfpga*/
|
||||
|
|
@ -0,0 +1,89 @@
|
|||
#ifndef PCF_DATA_H
|
||||
#define PCF_DATA_H
|
||||
|
||||
/********************************************************************
|
||||
* This file include the declaration of pcf data
|
||||
*******************************************************************/
|
||||
#include <string>
|
||||
#include <map>
|
||||
#include <array>
|
||||
|
||||
/* Headers from vtrutil library */
|
||||
#include "vtr_vector.h"
|
||||
#include "vtr_geometry.h"
|
||||
|
||||
/* Headers from openfpgautil library */
|
||||
#include "openfpga_port.h"
|
||||
|
||||
#include "pcf_data_fwd.h"
|
||||
|
||||
/* Begin namespace openfpga */
|
||||
namespace openfpga {
|
||||
|
||||
/********************************************************************
|
||||
* A data structure to constain PCF data
|
||||
* This data structure may include a number of design constraints
|
||||
* - I/O constraint, for instance, force a net to be mapped to specific pin
|
||||
*
|
||||
* Typical usage:
|
||||
* --------------
|
||||
* // Create an object
|
||||
* PcfData pcf_data;
|
||||
* // Add a constraint
|
||||
* PcfIoConstraintId io_id = pcf_data.create_io_constraint();
|
||||
* pcf_data.set_io_net(io_id, net_name);
|
||||
* pcf_data.set_io_pin(io_id, pin_name);
|
||||
*
|
||||
*******************************************************************/
|
||||
class PcfData {
|
||||
public: /* Types */
|
||||
typedef vtr::vector<PcfIoConstraintId, PcfIoConstraintId>::const_iterator pcf_io_constraint_iterator;
|
||||
/* Create range */
|
||||
typedef vtr::Range<pcf_io_constraint_iterator> pcf_io_constraint_range;
|
||||
public: /* Constructors */
|
||||
PcfData();
|
||||
public: /* Accessors: aggregates */
|
||||
pcf_io_constraint_range io_constraints() const;
|
||||
public: /* Public Accessors: Basic data query */
|
||||
/* Get the pin to be constrained */
|
||||
openfpga::BasicPort io_pin(const PcfIoConstraintId& io_id) const;
|
||||
|
||||
/* Get the net to be constrained */
|
||||
std::string io_net(const PcfIoConstraintId& io_id) const;
|
||||
|
||||
/* Check if there are any io constraints */
|
||||
bool empty() const;
|
||||
|
||||
public: /* Public Mutators */
|
||||
/* Reserve a number of design constraints to be memory efficent */
|
||||
void reserve_io_constraints(const size_t& num_io_constraints);
|
||||
|
||||
/* Add a pin constraint to storage */
|
||||
PcfIoConstraintId create_io_constraint();
|
||||
|
||||
/* Set the net for an io constraint */
|
||||
void set_io_net(const PcfIoConstraintId& io_id,
|
||||
const std::string& net);
|
||||
|
||||
/* Set the net for an io constraint */
|
||||
void set_io_pin(const PcfIoConstraintId& io_id,
|
||||
const std::string& pin);
|
||||
|
||||
public: /* Public invalidators/validators */
|
||||
/* Show if the constraint id is a valid for data queries */
|
||||
bool valid_io_constraint_id(const PcfIoConstraintId& io_id) const;
|
||||
|
||||
private: /* Internal data */
|
||||
/* Unique ids for each design constraint */
|
||||
vtr::vector<PcfIoConstraintId, PcfIoConstraintId> io_constraint_ids_;
|
||||
|
||||
/* Pins to constraint */
|
||||
vtr::vector<PcfIoConstraintId, openfpga::BasicPort> io_constraint_pins_;
|
||||
|
||||
/* Nets to constraint */
|
||||
vtr::vector<PcfIoConstraintId, std::string> io_constraint_nets_;
|
||||
};
|
||||
|
||||
} /* End namespace openfpga*/
|
||||
|
||||
#endif
|
|
@ -0,0 +1,22 @@
|
|||
/************************************************************************
|
||||
* A header file for PinConstraints class, including critical data declaration
|
||||
* Please include this file only for using any PinConstraints data structure
|
||||
* Refer to pin_constraints.h for more details
|
||||
***********************************************************************/
|
||||
|
||||
/************************************************************************
|
||||
* Create strong id for PinConstraints to avoid illegal type casting
|
||||
***********************************************************************/
|
||||
#ifndef PCF_DATA_FWD_H
|
||||
#define PCF_DATA_FWD_H
|
||||
|
||||
#include "vtr_strong_id.h"
|
||||
|
||||
struct pcf_io_constraint_id_tag;
|
||||
|
||||
typedef vtr::StrongId<pcf_io_constraint_id_tag> PcfIoConstraintId;
|
||||
|
||||
/* Short declaration of class */
|
||||
class PcfData;
|
||||
|
||||
#endif
|
|
@ -13,7 +13,8 @@
|
|||
namespace openfpga {
|
||||
|
||||
/* Parse a .pcf file through a stream, return an object which contains all the data */
|
||||
PcfData read_pcf(const char* fname);
|
||||
int read_pcf(const char* fname,
|
||||
PcfData& pcf_data);
|
||||
|
||||
} /* End namespace openfpga*/
|
||||
|
||||
|
|
Loading…
Reference in New Issue