gowin: fixes default networks
This commit is contained in:
parent
787fac7649
commit
bbe9ea9d65
@ -636,7 +636,45 @@ static void set_net_constant(const Context *ctx, NetInfo *orig, NetInfo *constne
|
|||||||
CellInfo *uc = user.cell;
|
CellInfo *uc = user.cell;
|
||||||
if (ctx->verbose)
|
if (ctx->verbose)
|
||||||
log_info("%s user %s\n", ctx->nameOf(orig), ctx->nameOf(uc));
|
log_info("%s user %s\n", ctx->nameOf(orig), ctx->nameOf(uc));
|
||||||
if ((is_lut(ctx, uc) || is_lc(ctx, uc)) && (user.port.str(ctx).at(0) == 'I') && !constval) {
|
|
||||||
|
if ((is_lut(ctx, uc)) && (user.port.str(ctx).at(0) == 'I') && !constval) {
|
||||||
|
auto it_param = uc->params.find(id_INIT);
|
||||||
|
if (it_param == uc->params.end())
|
||||||
|
log_error("No initialization for lut found.\n");
|
||||||
|
|
||||||
|
int64_t uc_init = it_param->second.intval;
|
||||||
|
int64_t mask = 0;
|
||||||
|
uint8_t amt = 0;
|
||||||
|
|
||||||
|
if (user.port == id_I0) {
|
||||||
|
mask = 0x5555;
|
||||||
|
amt = 1;
|
||||||
|
} else if (user.port == id_I1) {
|
||||||
|
mask = 0x3333;
|
||||||
|
amt = 2;
|
||||||
|
} else if (user.port == id_I2) {
|
||||||
|
mask = 0x0F0F;
|
||||||
|
amt = 4;
|
||||||
|
} else if (user.port == id_I3) {
|
||||||
|
mask = 0x00FF;
|
||||||
|
amt = 8;
|
||||||
|
} else {
|
||||||
|
log_error("Port number invalid.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((constnet->name == ctx->id("$PACKER_GND_NET"))) {
|
||||||
|
uc_init = (uc_init & mask) | ((uc_init & mask) << amt);
|
||||||
|
} else {
|
||||||
|
uc_init = (uc_init & (mask<<amt)) | ((uc_init & (mask<<amt)) >> amt);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t uc_init_len = it_param->second.to_string().length();
|
||||||
|
uc_init &= (1LL << uc_init_len) - 1;
|
||||||
|
|
||||||
|
if (ctx->verbose)
|
||||||
|
log_info("%s lut config modified from 0x%lX to 0x%lX\n", ctx->nameOf(uc), it_param->second.intval, uc_init);
|
||||||
|
|
||||||
|
it_param->second = Property(uc_init, uc_init_len);
|
||||||
uc->ports[user.port].net = nullptr;
|
uc->ports[user.port].net = nullptr;
|
||||||
uc->ports[user.port].user_idx = {};
|
uc->ports[user.port].user_idx = {};
|
||||||
} else {
|
} else {
|
||||||
@ -679,7 +717,7 @@ static void pack_constants(Context *ctx)
|
|||||||
ctx->cells.erase(drv_cell);
|
ctx->cells.erase(drv_cell);
|
||||||
} else if (ni->driver.cell != nullptr && ni->driver.cell->type == id_VCC) {
|
} else if (ni->driver.cell != nullptr && ni->driver.cell->type == id_VCC) {
|
||||||
IdString drv_cell = ni->driver.cell->name;
|
IdString drv_cell = ni->driver.cell->name;
|
||||||
set_net_constant(ctx, ni, vcc_net.get(), true);
|
set_net_constant(ctx, ni, vcc_net.get(), false);
|
||||||
dead_nets.push_back(net.first);
|
dead_nets.push_back(net.first);
|
||||||
ctx->cells.erase(drv_cell);
|
ctx->cells.erase(drv_cell);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user