aboutsummaryrefslogtreecommitdiffstats
path: root/icepack
diff options
context:
space:
mode:
authorWilliam D. Jones <thor0505@comcast.net>2017-12-31 01:52:59 -0500
committerWilliam D. Jones <thor0505@comcast.net>2017-12-31 01:52:59 -0500
commit182e9350de009dc014ad15cf168afb5e98a38df2 (patch)
tree8ea6e2adec5830866b4cd2428d1c1ca7cec7b255 /icepack
parentc093efc01558a56a0ab2ee35d0c896ce3f692bbe (diff)
downloadicestorm-182e9350de009dc014ad15cf168afb5e98a38df2.tar.gz
icestorm-182e9350de009dc014ad15cf168afb5e98a38df2.tar.bz2
icestorm-182e9350de009dc014ad15cf168afb5e98a38df2.zip
Enable writing nosleep config bit into output bitstream.
Diffstat (limited to 'icepack')
-rw-r--r--icepack/icepack.cc41
1 files changed, 30 insertions, 11 deletions
diff --git a/icepack/icepack.cc b/icepack/icepack.cc
index b1d0bc6..ac3e8c6 100644
--- a/icepack/icepack.cc
+++ b/icepack/icepack.cc
@@ -117,7 +117,7 @@ struct FpgaConfig
void write_bits(std::ostream &ofs) const;
// icebox i/o
- void read_ascii(std::istream &ifs);
+ void read_ascii(std::istream &ifs, bool nosleep);
void write_ascii(std::ostream &ofs) const;
// netpbm i/o
@@ -453,15 +453,26 @@ void FpgaConfig::write_bits(std::ostream &ofs) const
write_byte(ofs, crc_value, file_offset, 0x05);
crc_value = 0xffff;
- debug("Setting warmboot to '%s'.\n", this->warmboot.c_str());
- write_byte(ofs, crc_value, file_offset, 0x92);
- write_byte(ofs, crc_value, file_offset, 0x00);
- if (this->warmboot == "disabled")
+ {
+ uint8_t nosleep_flag;
+ debug("Setting warmboot to '%s', nosleep to '%s'.\n", this->warmboot.c_str(), this->nosleep.c_str());
+ write_byte(ofs, crc_value, file_offset, 0x92);
write_byte(ofs, crc_value, file_offset, 0x00);
- else if (this->warmboot == "enabled")
- write_byte(ofs, crc_value, file_offset, 0x20);
- else
- error("Unknown warmboot setting '%s'.\n", this->warmboot.c_str());
+
+ if (this->nosleep == "disabled")
+ nosleep_flag = 0;
+ else if (this->nosleep == "enabled")
+ nosleep_flag = 1;
+ else
+ error("Unknown nosleep setting '%s'.\n", this->nosleep.c_str());
+
+ if (this->warmboot == "disabled")
+ write_byte(ofs, crc_value, file_offset, 0x00 | nosleep_flag);
+ else if (this->warmboot == "enabled")
+ write_byte(ofs, crc_value, file_offset, 0x20 | nosleep_flag);
+ else
+ error("Unknown warmboot setting '%s'.\n", this->warmboot.c_str());
+ }
debug("CRAM: Setting bank width to %d.\n", this->cram_width);
write_byte(ofs, crc_value, file_offset, 0x62);
@@ -590,7 +601,7 @@ void FpgaConfig::write_bits(std::ostream &ofs) const
write_byte(ofs, crc_value, file_offset, 0x00);
}
-void FpgaConfig::read_ascii(std::istream &ifs)
+void FpgaConfig::read_ascii(std::istream &ifs, bool nosleep)
{
debug("## %s\n", __PRETTY_FUNCTION__);
info("Parsing ascii file..\n");
@@ -719,6 +730,14 @@ void FpgaConfig::read_ascii(std::istream &ifs)
continue;
}
+ // No ".nosleep" section despite sharing the same byte as .warmboot.
+ // ".nosleep" is specified when icepack is invoked, which is too late.
+ // So we inject the section based on command line argument.
+ if (nosleep)
+ this->nosleep = "enabled";
+ else
+ this->nosleep = "disabled";
+
if (command == ".io_tile" || command == ".logic_tile" || command == ".ramb_tile" || command == ".ramt_tile" || command.substr(0, 4) == ".dsp" || command == ".ipcon_tile")
{
if (!got_device)
@@ -1378,7 +1397,7 @@ int main(int argc, char **argv)
if (!netpbm_mode)
fpga_config.write_ascii(*osp);
} else {
- fpga_config.read_ascii(*isp);
+ fpga_config.read_ascii(*isp, nosleep_mode);
if (!netpbm_mode)
fpga_config.write_bits(*osp);
}