ice40: Add HFOSC support, force fabric routing on oscillators for now
Signed-off-by: David Shah <davey1576@gmail.com>
This commit is contained in:
parent
bbd2ecf558
commit
0414c93403
@ -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},
|
||||
|
@ -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);
|
||||
|
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user