[lib] add missing file

This commit is contained in:
tangxifan 2022-07-27 12:16:53 -07:00
parent 3277e89f5e
commit 14726e9317
1 changed files with 78 additions and 0 deletions

View File

@ -0,0 +1,78 @@
/******************************************************************************
* Inspired from https://github.com/genbtc/VerilogPCFparser
******************************************************************************/
#include <sstream>
/* Headers from vtrutil library */
#include "vtr_log.h"
#include "vtr_assert.h"
#include "vtr_time.h"
/* Headers from openfpgautil library */
#include "openfpga_digest.h"
#include "pcf_reader.h"
/* begin namespace openfpga */
namespace openfpga {
/**************************************************
* Constants
*************************************************/
constexpr char COMMENT = '#';
/********************************************************************
* A writer to output a repack pin constraint object to XML format
*
* Return 0 if successful
* Return 1 if there are serious errors when parsing data
* Return 2 if fail when opening files
*******************************************************************/
int read_pcf(const char* fname,
PcfData& pcf_data) {
vtr::ScopedStartFinishTimer timer("Read " + std::string(fname));
/* Create a file handler */
std::ifstream fp(fname);
if (!fp.is_open()) {
VTR_LOG_ERROR("Fail to open pcf file '%s'!", fname);
return 2;
}
int num_err = 0;
/* Get line by line */
std::string line;
while (std::getline(fp, line)) {
std::stringstream ss(line);
while (ss) {
std::string word;
/* TODO: Use command parser */
if (ss >> word) {
if (word.find("set_io") == 0) {
std::string net_name;
std::string pin_name;
ss >> net_name >> pin_name;
/* Decode data */
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);
} else if (word[0] == COMMENT) { // if it's a comment
break; //or ignore the full line comment and move on
} else {
/* Reach unknown command, error out */
VTR_LOG_ERROR("Unknown command '%s'!\n", word.c_str());
num_err++;
break; //and move onto next line. without this, it will accept more following values on this line
}
}
}
}
if (num_err) {
return 1;
}
return 0;
}
} /* end namespace openfpga */