blob: 70fb3f6cab836c074623335d7a45729c5483c0cb [file] [log] [blame]
#include "parameters.h"
#include "vtr_assert.h"
namespace fasm {
void Parameters::AddParameter(const std::string &eblif_parameter, const std::string &fasm_feature) {
FeatureParameter fp;
fp.width = FeatureWidth(fasm_feature);
fp.feature = fasm_feature;
features_.insert(std::make_pair(eblif_parameter, fp));
}
std::string Parameters::EmitFasmFeature(const std::string &eblif_parameter, const std::string &value) {
std::ostringstream out;
auto range = features_.equal_range(eblif_parameter);
for(auto i = range.first; i != range.second; ++i) {
// Parameter should have exactly the expected number of bits.
const FeatureParameter &fp = i->second;
if(value.size() != fp.width) {
vpr_throw(VPR_ERROR_OTHER,
__FILE__, __LINE__, "When emitting FASM for parameter %s, expected width of %d got width of %d, value = \"%s\".",
eblif_parameter.c_str(), fp.width, value.size(), value.c_str());
}
VTR_ASSERT(value.size() == fp.width);
out << fp.feature << "=" << fp.width << "'b" << value << std::endl;
}
return out.str();
}
size_t Parameters::FeatureWidth(const std::string &feature) const {
size_t start_of_address = feature.rfind('[');
size_t end_of_address = feature.rfind(']');
if(start_of_address == std::string::npos) {
VTR_ASSERT(end_of_address == std::string::npos);
return 1;
}
VTR_ASSERT(end_of_address > start_of_address+1);
auto address = feature.substr(start_of_address+1, end_of_address - start_of_address - 1);
size_t address_split = address.find(':');
if(address_split == std::string::npos) {
return 1;
}
VTR_ASSERT(address_split > 0);
VTR_ASSERT(address_split+1 < address.size());
int high_slice = vtr::atoi(address.substr(0, address_split));
int low_slice = vtr::atoi(address.substr(address_split+1));
VTR_ASSERT(high_slice >= low_slice);
return high_slice - low_slice + 1;
}
} // namespace fasm