diff options
Diffstat (limited to 'ice40')
-rw-r--r-- | ice40/bitstream.cc | 4 | ||||
-rw-r--r-- | ice40/cells.cc | 4 | ||||
-rw-r--r-- | ice40/pack.cc | 15 |
3 files changed, 20 insertions, 3 deletions
diff --git a/ice40/bitstream.cc b/ice40/bitstream.cc index e9851a83..d0d6b205 100644 --- a/ice40/bitstream.cc +++ b/ice40/bitstream.cc @@ -425,6 +425,10 @@ void write_asc(const Context *ctx, std::ostream &out) {"A_SIGNED", 1},
{"B_SIGNED", 1}};
configure_extra_cell(config, ctx, cell.second.get(), mac16_params, false, std::string("IpConfig."));
+ } else if (cell.second->type == ctx->id("ICESTORM_HFOSC")) {
+ const std::vector<std::pair<std::string, int>> hfosc_params = {{"CLKHF_DIV", 2}, {"TRIM_EN", 1}};
+ configure_extra_cell(config, ctx, cell.second.get(), hfosc_params, true, std::string("IpConfig."));
+
} else if (cell.second->type == ctx->id("ICESTORM_PLL")) {
const std::vector<std::pair<std::string, int>> pll_params = {{"DELAY_ADJMODE_FB", 1},
{"DELAY_ADJMODE_REL", 1},
diff --git a/ice40/cells.cc b/ice40/cells.cc index 610bf85e..5bdc7990 100644 --- a/ice40/cells.cc +++ b/ice40/cells.cc @@ -113,8 +113,8 @@ std::unique_ptr<CellInfo> create_ice_cell(Context *ctx, IdString type, std::stri add_port(ctx, new_cell.get(), "CLKLF", PORT_OUT); add_port(ctx, new_cell.get(), "CLKLF_FABRIC", PORT_OUT); } else if (type == ctx->id("ICESTORM_HFOSC")) { - new_cell->params[ctx->id("CLKHF_DIV")] = "0"; - new_cell->params[ctx->id("TRIM_EN")] = "0"; + new_cell->params[ctx->id("CLKHF_DIV")] = "0b00"; + new_cell->params[ctx->id("TRIM_EN")] = "0b0"; add_port(ctx, new_cell.get(), "CLKHFEN", PORT_IN); add_port(ctx, new_cell.get(), "CLKHFPU", PORT_IN); diff --git a/ice40/pack.cc b/ice40/pack.cc index 91dcf846..08f66369 100644 --- a/ice40/pack.cc +++ b/ice40/pack.cc @@ -607,12 +607,25 @@ static void pack_special(Context *ctx) packed_cells.insert(ci->name); replace_port(ci, ctx->id("CLKLFEN"), packed.get(), ctx->id("CLKLFEN")); replace_port(ci, ctx->id("CLKLFPU"), packed.get(), ctx->id("CLKLFPU")); - if (bool_or_default(ci->attrs, ctx->id("ROUTE_THROUGH_FABRIC"))) { + if (/*bool_or_default(ci->attrs, ctx->id("ROUTE_THROUGH_FABRIC"))*/ true) { // FIXME replace_port(ci, ctx->id("CLKLF"), packed.get(), ctx->id("CLKLF_FABRIC")); } else { replace_port(ci, ctx->id("CLKLF"), packed.get(), ctx->id("CLKLF")); } new_cells.push_back(std::move(packed)); + } else if (is_sb_hfosc(ctx, ci)) { + std::unique_ptr<CellInfo> packed = + create_ice_cell(ctx, ctx->id("ICESTORM_HFOSC"), ci->name.str(ctx) + "_OSC"); + packed_cells.insert(ci->name); + packed->params[ctx->id("CLKHF_DIV")] = str_or_default(ci->params, ctx->id("CLKHF_DIV"), "0b00"); + replace_port(ci, ctx->id("CLKHFEN"), packed.get(), ctx->id("CLKHFEN")); + replace_port(ci, ctx->id("CLKHFPU"), packed.get(), ctx->id("CLKHFPU")); + if (/*bool_or_default(ci->attrs, ctx->id("ROUTE_THROUGH_FABRIC"))*/ true) { // FIXME + replace_port(ci, ctx->id("CLKHF"), packed.get(), ctx->id("CLKHF_FABRIC")); + } else { + replace_port(ci, ctx->id("CLKHF"), packed.get(), ctx->id("CLKHF")); + } + new_cells.push_back(std::move(packed)); } else if (is_sb_spram(ctx, ci)) { std::unique_ptr<CellInfo> packed = create_ice_cell(ctx, ctx->id("ICESTORM_SPRAM"), ci->name.str(ctx) + "_RAM"); |