jedParser: honor verbose, suppress message in parse function and add userCode

This commit is contained in:
Gwenhael Goavec-Merou 2019-11-21 08:37:43 +01:00
parent 57178b4688
commit 32fc458eff
2 changed files with 41 additions and 23 deletions

View File

@ -37,9 +37,10 @@
using namespace std; using namespace std;
JedParser::JedParser(string filename): JedParser::JedParser(string filename, bool verbose):
ConfigBitstreamParser(filename, ConfigBitstreamParser::BIN_MODE), ConfigBitstreamParser(filename, ConfigBitstreamParser::BIN_MODE),
_fuse_count(0), _pin_count(0), _featuresRow(0), _feabits(0), _checksum(0) _fuse_count(0), _pin_count(0), _featuresRow(0), _feabits(0), _checksum(0),
_userCode(0), _security_settings(0), _default_fuse_state(0)
{ {
} }
@ -202,10 +203,8 @@ int JedParser::parse()
std::vector<string>lines; std::vector<string>lines;
do { do {
lines = readJEDLine(); lines = readJEDLine();
if (lines.size() == 0) { if (lines.size() == 0)
printf("a un problem\n");
break; break;
}
switch (lines[0][0]) { switch (lines[0][0]) {
case 'N': // note case 'N': // note
@ -227,18 +226,17 @@ int JedParser::parse()
} }
break; break;
case 'G': case 'G':
cout << lines[0] << endl; _security_settings = static_cast<uint8_t>(lines[0][1]) - '0';
break; break;
case 'F': case 'F':
cout << lines[0] << endl; _default_fuse_state = lines[0][1] - '0';
break; break;
case 'C': case 'C':
sscanf(lines[0].c_str() + 1, "%hx", &_checksum); sscanf(lines[0].c_str() + 1, "%hx", &_checksum);
cout << "fuse checksum " << lines[0];
printf(" AA %x\n", _checksum);
break; break;
case 0x03: case 0x03:
cout << "end" << endl; if (_verbose)
cout << "end" << endl;
break; break;
case 'E': case 'E':
parseEField(lines); parseEField(lines);
@ -247,16 +245,32 @@ int JedParser::parse()
parseLField(lines); parseLField(lines);
_data_list[_data_list.size()-1].associatedPrevNote = previousNote; _data_list[_data_list.size()-1].associatedPrevNote = previousNote;
break; break;
case 'U': // userCode
switch (lines[0][1]) {
case 'H': /* hex */
sscanf(lines[0].c_str() + 2, "%x", &_userCode);
break;
case 'A': /* ASCII */
sscanf(lines[0].c_str() + 2, "%d", &_userCode);
break;
default: /* binary */
for (size_t ii = 1; ii < lines[0].size(); ii++)
_userCode = ((_userCode << 1) | (lines[0][ii] - '0'));
}
break;
default: default:
printf("inconnu\n"); printf("inconnu\n");
cout << lines[0]<< endl; cout << lines[0]<< endl;
return EXIT_FAILURE;
} }
} while (lines[0][0] != 0x03); } while (lines[0][0] != 0x03);
int size = 0; int size = 0;
for (size_t i = 0; i < _data_list.size(); i++) { for (size_t i = 0; i < _data_list.size(); i++) {
printf("area[%ld] %d %d ", i, _data_list[i].offset, _data_list[i].len); if (_verbose) {
printf("%s\n", _data_list[i].associatedPrevNote.c_str()); printf("area[%ld] %d %d ", i, _data_list[i].offset, _data_list[i].len);
printf("%s\n", _data_list[i].associatedPrevNote.c_str());
}
size += _data_list[i].len; size += _data_list[i].len;
} }
@ -266,19 +280,20 @@ int JedParser::parse()
checksum += (uint8_t)_data_list[0].data[line][col]; checksum += (uint8_t)_data_list[0].data[line][col];
} }
printf("theorical checksum %x -> %x\n", _checksum, checksum); if (_verbose)
printf("theorical checksum %x -> %x\n", _checksum, checksum);
FILE *fd = fopen("toto.txt", "w+"); if (_checksum != checksum) {
for (size_t line = 0; line < _data_list[0].data.size(); line++) { cerr << "Error: wrong checksum" << endl;
for (size_t col = 0; col < _data_list[0].data[line].size(); col++) return 0;
fprintf(fd, "%02x ", (unsigned char)_data_list[0].data[line][col]);
fprintf(fd, "\n");
} }
fclose(fd);
printf("array size %ld\n", _data_list[0].data.size());
if (_fuse_count != size) if (_verbose)
printf("array size %ld\n", _data_list[0].data.size());
if (_fuse_count != size) {
cerr << "Not all fuses are programmed" << endl; cerr << "Not all fuses are programmed" << endl;
return 0;
}
return EXIT_SUCCESS; return EXIT_SUCCESS;

View File

@ -36,7 +36,7 @@ class JedParser: public ConfigBitstreamParser {
}; };
public: public:
JedParser(std::string filename); JedParser(std::string filename, bool verbose = false);
int parse(); int parse();
void display(); void display();
@ -61,6 +61,9 @@ class JedParser: public ConfigBitstreamParser {
uint64_t _featuresRow; uint64_t _featuresRow;
uint16_t _feabits; uint16_t _feabits;
uint16_t _checksum; uint16_t _checksum;
uint32_t _userCode;
uint8_t _security_settings;
uint8_t _default_fuse_state;
}; };
#endif // JEDPARSER_HPP_ #endif // JEDPARSER_HPP_