mirror of https://github.com/YosysHQ/icestorm.git
Merge branch 'hermitsoft-master'
This commit is contained in:
commit
de563bdd95
|
|
@ -390,7 +390,9 @@ void FpgaConfig::read_bits(std::istream &ifs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this->cram_width == 332 && this->cram_height == 144)
|
if (this->cram_width == 182 && this->cram_height == 80)
|
||||||
|
this->device = "384";
|
||||||
|
else if (this->cram_width == 332 && this->cram_height == 144)
|
||||||
this->device = "1k";
|
this->device = "1k";
|
||||||
else if (this->cram_width == 872 && this->cram_height == 272)
|
else if (this->cram_width == 872 && this->cram_height == 272)
|
||||||
this->device = "8k";
|
this->device = "8k";
|
||||||
|
|
@ -485,46 +487,49 @@ void FpgaConfig::write_bits(std::ostream &ofs) const
|
||||||
|
|
||||||
int bram_chunk_size = 128;
|
int bram_chunk_size = 128;
|
||||||
|
|
||||||
debug("BRAM: Setting bank width to %d.\n", this->bram_width);
|
if (this->bram_width && this->bram_height)
|
||||||
write_byte(ofs, crc_value, file_offset, 0x62);
|
|
||||||
write_byte(ofs, crc_value, file_offset, (this->bram_width-1) >> 8);
|
|
||||||
write_byte(ofs, crc_value, file_offset, (this->bram_width-1));
|
|
||||||
|
|
||||||
debug("BRAM: Setting bank height to %d.\n", this->bram_height);
|
|
||||||
write_byte(ofs, crc_value, file_offset, 0x72);
|
|
||||||
write_byte(ofs, crc_value, file_offset, bram_chunk_size >> 8);
|
|
||||||
write_byte(ofs, crc_value, file_offset, bram_chunk_size);
|
|
||||||
|
|
||||||
for (int bram_bank = 0; bram_bank < 4; bram_bank++)
|
|
||||||
{
|
{
|
||||||
debug("BRAM: Setting bank %d.\n", bram_bank);
|
debug("BRAM: Setting bank width to %d.\n", this->bram_width);
|
||||||
write_byte(ofs, crc_value, file_offset, 0x11);
|
write_byte(ofs, crc_value, file_offset, 0x62);
|
||||||
write_byte(ofs, crc_value, file_offset, bram_bank);
|
write_byte(ofs, crc_value, file_offset, (this->bram_width-1) >> 8);
|
||||||
|
write_byte(ofs, crc_value, file_offset, (this->bram_width-1));
|
||||||
|
|
||||||
for (int offset = 0; offset < this->bram_height; offset += bram_chunk_size)
|
debug("BRAM: Setting bank height to %d.\n", this->bram_height);
|
||||||
|
write_byte(ofs, crc_value, file_offset, 0x72);
|
||||||
|
write_byte(ofs, crc_value, file_offset, bram_chunk_size >> 8);
|
||||||
|
write_byte(ofs, crc_value, file_offset, bram_chunk_size);
|
||||||
|
|
||||||
|
for (int bram_bank = 0; bram_bank < 4; bram_bank++)
|
||||||
{
|
{
|
||||||
vector<bool> bram_bits;
|
debug("BRAM: Setting bank %d.\n", bram_bank);
|
||||||
for (int bram_y = 0; bram_y < bram_chunk_size; bram_y++)
|
write_byte(ofs, crc_value, file_offset, 0x11);
|
||||||
for (int bram_x = 0; bram_x < this->bram_width; bram_x++)
|
write_byte(ofs, crc_value, file_offset, bram_bank);
|
||||||
bram_bits.push_back(this->bram[bram_bank][bram_x][bram_y+offset]);
|
|
||||||
|
|
||||||
debug("BRAM: Setting bank offset to %d.\n", offset);
|
for (int offset = 0; offset < this->bram_height; offset += bram_chunk_size)
|
||||||
write_byte(ofs, crc_value, file_offset, 0x82);
|
{
|
||||||
write_byte(ofs, crc_value, file_offset, offset >> 8);
|
vector<bool> bram_bits;
|
||||||
write_byte(ofs, crc_value, file_offset, offset);
|
for (int bram_y = 0; bram_y < bram_chunk_size; bram_y++)
|
||||||
|
for (int bram_x = 0; bram_x < this->bram_width; bram_x++)
|
||||||
|
bram_bits.push_back(this->bram[bram_bank][bram_x][bram_y+offset]);
|
||||||
|
|
||||||
debug("BRAM: Writing bank %d data.\n", bram_bank);
|
debug("BRAM: Setting bank offset to %d.\n", offset);
|
||||||
write_byte(ofs, crc_value, file_offset, 0x01);
|
write_byte(ofs, crc_value, file_offset, 0x82);
|
||||||
write_byte(ofs, crc_value, file_offset, 0x03);
|
write_byte(ofs, crc_value, file_offset, offset >> 8);
|
||||||
for (int i = 0; i < int(bram_bits.size()); i += 8) {
|
write_byte(ofs, crc_value, file_offset, offset);
|
||||||
uint8_t byte = 0;
|
|
||||||
for (int j = 0; j < 8; j++)
|
debug("BRAM: Writing bank %d data.\n", bram_bank);
|
||||||
byte = (byte << 1) | (bram_bits[i+j] ? 1 : 0);
|
write_byte(ofs, crc_value, file_offset, 0x01);
|
||||||
write_byte(ofs, crc_value, file_offset, byte);
|
write_byte(ofs, crc_value, file_offset, 0x03);
|
||||||
|
for (int i = 0; i < int(bram_bits.size()); i += 8) {
|
||||||
|
uint8_t byte = 0;
|
||||||
|
for (int j = 0; j < 8; j++)
|
||||||
|
byte = (byte << 1) | (bram_bits[i+j] ? 1 : 0);
|
||||||
|
write_byte(ofs, crc_value, file_offset, byte);
|
||||||
|
}
|
||||||
|
|
||||||
|
write_byte(ofs, crc_value, file_offset, 0x00);
|
||||||
|
write_byte(ofs, crc_value, file_offset, 0x00);
|
||||||
}
|
}
|
||||||
|
|
||||||
write_byte(ofs, crc_value, file_offset, 0x00);
|
|
||||||
write_byte(ofs, crc_value, file_offset, 0x00);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -598,6 +603,12 @@ void FpgaConfig::read_ascii(std::istream &ifs)
|
||||||
|
|
||||||
is >> this->device;
|
is >> this->device;
|
||||||
|
|
||||||
|
if (this->device == "384") {
|
||||||
|
this->cram_width = 182;
|
||||||
|
this->cram_height = 80;
|
||||||
|
this->bram_width = 0;
|
||||||
|
this->bram_height = 0;
|
||||||
|
} else
|
||||||
if (this->device == "1k") {
|
if (this->device == "1k") {
|
||||||
this->cram_width = 332;
|
this->cram_width = 332;
|
||||||
this->cram_height = 144;
|
this->cram_height = 144;
|
||||||
|
|
@ -857,6 +868,7 @@ void FpgaConfig::write_bram_pbm(std::ostream &ofs, int bank_num) const
|
||||||
|
|
||||||
int FpgaConfig::chip_width() const
|
int FpgaConfig::chip_width() const
|
||||||
{
|
{
|
||||||
|
if (this->device == "384") return 6;
|
||||||
if (this->device == "1k") return 12;
|
if (this->device == "1k") return 12;
|
||||||
if (this->device == "8k") return 32;
|
if (this->device == "8k") return 32;
|
||||||
panic("Unknown chip type '%s'.\n", this->device.c_str());
|
panic("Unknown chip type '%s'.\n", this->device.c_str());
|
||||||
|
|
@ -864,6 +876,7 @@ int FpgaConfig::chip_width() const
|
||||||
|
|
||||||
int FpgaConfig::chip_height() const
|
int FpgaConfig::chip_height() const
|
||||||
{
|
{
|
||||||
|
if (this->device == "384") return 8;
|
||||||
if (this->device == "1k") return 16;
|
if (this->device == "1k") return 16;
|
||||||
if (this->device == "8k") return 32;
|
if (this->device == "8k") return 32;
|
||||||
panic("Unknown chip type '%s'.\n", this->device.c_str());
|
panic("Unknown chip type '%s'.\n", this->device.c_str());
|
||||||
|
|
@ -871,6 +884,7 @@ int FpgaConfig::chip_height() const
|
||||||
|
|
||||||
vector<int> FpgaConfig::chip_cols() const
|
vector<int> FpgaConfig::chip_cols() const
|
||||||
{
|
{
|
||||||
|
if (this->device == "384") return vector<int>({18, 54, 54, 54, 54});
|
||||||
if (this->device == "1k") return vector<int>({18, 54, 54, 42, 54, 54, 54});
|
if (this->device == "1k") return vector<int>({18, 54, 54, 42, 54, 54, 54});
|
||||||
if (this->device == "8k") return vector<int>({18, 54, 54, 54, 54, 54, 54, 54, 42, 54, 54, 54, 54, 54, 54, 54, 54});
|
if (this->device == "8k") return vector<int>({18, 54, 54, 54, 54, 54, 54, 54, 42, 54, 54, 54, 54, 54, 54, 54, 54});
|
||||||
panic("Unknown chip type '%s'.\n", this->device.c_str());
|
panic("Unknown chip type '%s'.\n", this->device.c_str());
|
||||||
|
|
@ -881,6 +895,8 @@ string FpgaConfig::tile_type(int x, int y) const
|
||||||
if ((x == 0 || x == this->chip_width()+1) && (y == 0 || y == this->chip_height()+1)) return "corner";
|
if ((x == 0 || x == this->chip_width()+1) && (y == 0 || y == this->chip_height()+1)) return "corner";
|
||||||
if ((x == 0 || x == this->chip_width()+1) || (y == 0 || y == this->chip_height()+1)) return "io";
|
if ((x == 0 || x == this->chip_width()+1) || (y == 0 || y == this->chip_height()+1)) return "io";
|
||||||
|
|
||||||
|
if (this->device == "384") return "logic";
|
||||||
|
|
||||||
if (this->device == "1k") {
|
if (this->device == "1k") {
|
||||||
if (x == 3 || x == 10) return y % 2 == 1 ? "ramb" : "ramt";
|
if (x == 3 || x == 10) return y % 2 == 1 ? "ramb" : "ramt";
|
||||||
return "logic";
|
return "logic";
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue