aboutsummaryrefslogtreecommitdiffstats
path: root/icetime
diff options
context:
space:
mode:
authorDavid Shah <davey1576@gmail.com>2018-01-23 09:56:14 +0000
committerDavid Shah <davey1576@gmail.com>2018-01-23 09:56:14 +0000
commit49dfe15d8ceb4b51cf45c50009a6755308204332 (patch)
treecb0ba7465b64fff88f4d6273db03aa1dcdaa95fc /icetime
parent420ef041b6d633772a2abf9004f8da4af7962b77 (diff)
downloadicestorm-49dfe15d8ceb4b51cf45c50009a6755308204332.tar.gz
icestorm-49dfe15d8ceb4b51cf45c50009a6755308204332.tar.bz2
icestorm-49dfe15d8ceb4b51cf45c50009a6755308204332.zip
Parse extra cells in icetime
Diffstat (limited to 'icetime')
-rw-r--r--icetime/icetime.cc51
1 files changed, 50 insertions, 1 deletions
diff --git a/icetime/icetime.cc b/icetime/icetime.cc
index 60161c3..181124a 100644
--- a/icetime/icetime.cc
+++ b/icetime/icetime.cc
@@ -107,6 +107,9 @@ std::map<std::string, std::vector<std::pair<int, int>>> logic_tile_bits,
io_tile_bits, ramb_tile_bits, ramt_tile_bits, ipcon_tile_bits, dsp0_tile_bits,
dsp1_tile_bits, dsp2_tile_bits, dsp3_tile_bits;
+std::map<std::tuple<std::string, int, int, int>,
+ std::map<std::string, std::tuple<int, int, std::string>>> extra_cells;
+
std::string vstringf(const char *fmt, va_list ap)
{
std::string string;
@@ -329,8 +332,9 @@ void read_chipdb()
std::string mode;
int current_net = -1;
- int tile_x = -1, tile_y = -1;
+ int tile_x = -1, tile_y = -1, cell_z = -1;
std::string thiscfg;
+ std::string cellname;
std::vector<std::vector<int>> gbufin;
std::vector<std::vector<int>> gbufpin;
@@ -378,6 +382,22 @@ void read_chipdb()
continue;
}
+ if (mode == ".extra_cell") {
+ tile_x = atoi(strtok(nullptr, " \t\r\n"));
+ tile_y = atoi(strtok(nullptr, " \t\r\n"));
+ // For legacy reasons, extra_cell may be X Y name or X Y Z name
+ const char *z_or_name = strtok(nullptr, " \t\r\n");
+ if(isdigit(z_or_name[0])) {
+ cell_z = atoi(z_or_name);
+ cellname = std::string(strtok(nullptr, " \t\r\n"));
+ } else {
+ cell_z = 0;
+ cellname = std::string(z_or_name);
+ }
+ extra_cells[std::make_tuple(cellname, tile_x, tile_y, cell_z)] = {};
+ continue;
+ }
+
continue;
}
@@ -473,6 +493,14 @@ void read_chipdb()
if (extra_bits.count(key))
extrabitfunc.insert(tok);
}
+
+ if(mode == ".extra_cell") {
+ std::string key = std::string(tok);
+ int x = atoi(strtok(nullptr, " \t\r\n"));
+ int y = atoi(strtok(nullptr, " \t\r\n"));
+ std::string name = std::string(strtok(nullptr, " \t\r\n"));
+ extra_cells[make_tuple(cellname, tile_x, tile_y, cell_z)][key] = make_tuple(x, y, name);
+ }
}
fclose(fdb);
@@ -658,7 +686,28 @@ const std::set<std::string> &get_inports(std::string cell_type)
inports_map["SB_RAM40_4K"].insert(stringf("RADDR[%d]", i));
inports_map["SB_RAM40_4K"].insert(stringf("WADDR[%d]", i));
}
+
+ inports_map["SB_MAC16"] = { "CLK", "CE", "AHOLD", "BHOLD", "CHOLD", "DHOLD", "IRSTTOP", "IRSTBOT", "ORSTTOP", "ORSTBOT",
+ "OLOADTOP", "OLOADBOT", "ADDSUBTOP", "ADDSUBBOT", "OHOLDTOP", "OHOLDBOT", "CI", "ACCUMCI",
+ "SIGNEXTIN"};
+ for (int i = 0; i < 16; i++) {
+ inports_map["SB_MAC16"].insert(stringf("C[%d]", i));
+ inports_map["SB_MAC16"].insert(stringf("A[%d]", i));
+ inports_map["SB_MAC16"].insert(stringf("B[%d]", i));
+ inports_map["SB_MAC16"].insert(stringf("D[%d]", i));
+ }
+
+ inports_map["SB_SPRAM256KA"] = { "WREN", "CHIPSELECT", "CLOCK", "STANDBY", "SLEEP", "POWEROFF",
+ "MASKWREN[0]", "MASKWREN[1]", "MASKWREN[2]", "MASKWREN[3]"};
+
+ for (int i = 0; i < 16; i++) {
+ inports_map["SB_SPRAM256KA"].insert(stringf("DATAIN[%d]", i));
+ }
+ for (int i = 0; i < 14; i++) {
+ inports_map["SB_SPRAM256KA"].insert(stringf("ADDRESS[%d]", i));
+ }
+
inports_map["INTERCONN"] = { "I" };
}