2 #include "trg/cdc/FpgaUtility.h"
4 #include "FpgaUtility.h"
19 using std::stringstream;
36 if (value - floor(value) < 0.00001) value = floor(value);
37 if (floor(value + 1) - value < 0.00001) value = floor(value + 1);
43 if (-value + ceil(value) < 0.00001) value = ceil(value);
44 if (-ceil(value - 1) + value < 0.00001) value = ceil(value - 1);
55 if (inRadix < 2 || inRadix > 26) {
56 cout <<
"[Error] arbToDouble() => Radix is out of range [2,26]. Aborting." << endl;
60 for (
unsigned int iChar = 0; iChar < in.size(); iChar++) {
61 if (in[iChar] ==
'-')
continue;
62 result = result * inRadix;
63 if (in[iChar] >=
'0' && in[iChar] <=
'9') result += in[iChar] - 48;
64 else if (in[iChar] >=
'A' && in[iChar] <=
'Z') result += in[iChar] - 55;
65 else if (in[iChar] >=
'a' && in[iChar] <=
'z') result += in[iChar] - 87;
67 cout <<
"[Error] arbToDouble() => Strange character detected. Aborting." << endl;
71 if (in[0] ==
'-') result *= -1;
84 int rem = fmod(in, outRadix);
85 result.insert(result.begin(),
char((rem >= 0 && rem <= 9) ? rem + 48 : rem + 55));
86 in = (in / outRadix) - (rem / outRadix);
88 result.insert(result.begin(), char((in >= 0 && in <= 9) ? in + 48 : in + 55));
93 if (
int(result.size()) < numberOfDigits) {
94 int nBitsAdd = numberOfDigits - result.size();
95 for (
int iZero = 0; iZero < nBitsAdd; iZero++) {
96 result.insert(0,
"0");
98 }
else if (numberOfDigits == -1) {
99 }
else if (
int(result.size()) > numberOfDigits) {
100 cout <<
"[Error] doubleToArb() => numberOfDigits too small. Aborting." << endl;
103 if (sign == -1) result.insert(0,
"-");
121 if (
int(in.size()) < numberOfDigits) {
122 unsigned nBits = numberOfDigits - in.size();
123 for (
unsigned iZero = 0; iZero < nBits; iZero++) {
126 }
else if (
int(in.size()) >= numberOfDigits) {
127 cout <<
"[Error] signedToTwosComplement() => numberOfDigits too small. Aborting." << endl;
135 for (
unsigned int iChar = 0; iChar < in.size(); iChar++) {
136 if (in[iChar] ==
'1') in[iChar] =
'0';
137 else if (in[iChar] ==
'0') in[iChar] =
'1';
138 else cout <<
"[Error] signedToTwosComplement() => Strange character in string. Aborting." << endl;
142 for (
int iDigit = in.size() - 1; iDigit >= 0; iDigit--) {
143 if (in[
unsigned(iDigit)] ==
'0') {
144 in[unsigned(iDigit)] =
'1';
147 in[unsigned(iDigit)] =
'0';
162 for (
int iDigit = in.size() - 1; iDigit >= 0; iDigit--) {
163 if (in[
unsigned(iDigit)] ==
'1') {
164 in[unsigned(iDigit)] =
'0';
167 in[unsigned(iDigit)] =
'1';
172 for (
unsigned int iChar = 0; iChar < in.size(); iChar++) {
173 if (in[iChar] ==
'1') in[iChar] =
'0';
174 else if (in[iChar] ==
'0') in[iChar] =
'1';
175 else cout <<
"[Error] twosComplementToSigned() => Strange character in string. Aborting." << endl;
179 for (
int iDigit = 0; iDigit < int(in.size()); iDigit++) {
180 if (in[
unsigned(iDigit)] ==
'0') {
181 if (in.size() == 1)
break;
199 outFile.open(outFilePath.c_str());
201 for (
auto it = data.begin(); it != data.end(); it++) {
202 outFile << (*it).first <<
" ";
203 for (
unsigned iVector = 0; iVector < (*it).second.size(); iVector++) {
204 outFile << (*it).second[iVector] <<
" ";
214 std::string fileDirectory)
217 for (
auto it = data.begin(); it != data.end(); it++) {
227 coeFile.open(outFilePath.c_str());
229 coeFile <<
"memory_initialization_radix=10;" << endl;
230 coeFile <<
"memory_initialization_vector=" << endl;
231 unsigned nEntries = pow(2, lutInBitsize);
233 unsigned nDataSize = data.size();
234 for (
unsigned index = 0; index < (nEntries - 1); index++) {
235 if (index < nDataSize) coeFile << data[index] <<
"," << endl;
236 else coeFile << 0 <<
"," << endl;
238 if (nEntries <= nDataSize) coeFile << data[nEntries - 1] <<
";" << endl;
239 else coeFile << 0 <<
";" << endl;
248 coeFile.open(inFilePath.c_str());
249 if (coeFile.fail()) {
250 cout <<
"[Error] FpgaUtility::readCoe() => Can not open file: " << inFilePath << endl;
255 stringstream reformatCoeFile;
257 while (getline(coeFile, t_line)) {
259 t_line.erase(remove_if(t_line.begin(), t_line.end(), ::isspace), t_line.end());
261 if (t_line.size() == 0)
continue;
263 size_t t_iFind = t_line.find(
";");
264 if (t_iFind != string::npos) {
265 t_line.erase(t_iFind + 1, string::npos);
268 if (t_line ==
";")
continue;
270 if (t_line.find(
";") == string::npos) reformatCoeFile << t_line;
272 else reformatCoeFile << t_line.substr(0, t_line.size() - 1) << endl;
275 vector<string> keywords = {
"memory_initialization_radix",
"memory_initialization_vector"};
277 vector<string> t_rawData;
278 while (getline(reformatCoeFile, t_line)) {
281 size_t t_iFind = t_line.find(
"=");
282 if (t_iFind != string::npos) {
285 if (t_line.substr(0, t_iFind) ==
"memory_initialization_radix") {
287 t_radix = atoi(t_line.substr(t_iFind + 1, string::npos).c_str());
288 }
else if (t_line.substr(0, t_iFind) ==
"memory_initialization_vector") {
290 string t_dataLine = t_line.substr(t_iFind + 1, string::npos);
292 t_iFind = t_dataLine.find(
",");
293 if (t_iFind != string::npos) {
294 t_rawData.push_back(t_dataLine.substr(0, t_iFind));
295 t_dataLine.erase(0, t_iFind + 1);
298 t_rawData.push_back(t_dataLine);
303 cout <<
"[Error] FpgaUtility::readCoe() => .coe format keyword is wrong. Aborting" << endl;
307 cout <<
"[Error] FpgaUtility::readCoe() => .coe format is wrong. Needs keywords. Aborting" << endl;
318 data.resize(t_rawData.size());
320 if (!twosComplement) {
321 for (
int iData = 0; iData < int(t_rawData.size()); iData++) {
327 int nBits = t_rawData[0].size();
329 int t_max = pow(t_radix, nBits) - 1;
331 nBits = floor(log(t_max) / log(2)) + 1;
332 for (
int iData = 0; iData < int(t_rawData.size()); iData++) {