GCK for lowskew signals
This commit is contained in:
parent
9db9f4aa12
commit
10149b138f
@ -165,6 +165,10 @@ const dict<IdString,pool<IdString>> tube_clock_sinks = {
|
|||||||
{ id_GCK, { id_SI1, id_SI2 }},
|
{ id_GCK, { id_SI1, id_SI2 }},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const dict<IdString,pool<IdString>> fabric_lowskew_sinks = {
|
||||||
|
// TILE - DFF
|
||||||
|
{ id_BEYOND_FE, { id_L, id_R }},
|
||||||
|
};
|
||||||
// Sources
|
// Sources
|
||||||
// CKG
|
// CKG
|
||||||
const dict<IdString,pool<IdString>> ring_clock_source = {
|
const dict<IdString,pool<IdString>> ring_clock_source = {
|
||||||
@ -188,6 +192,12 @@ bool NgUltraImpl::is_fabric_clock_sink(const PortRef &ref)
|
|||||||
return fabric_clock_sinks.count(ref.cell->type) && fabric_clock_sinks.at(ref.cell->type).count(ref.port);
|
return fabric_clock_sinks.count(ref.cell->type) && fabric_clock_sinks.at(ref.cell->type).count(ref.port);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NgUltraImpl::is_fabric_lowskew_sink(const PortRef &ref)
|
||||||
|
{
|
||||||
|
if (fabric_lowskew_sinks.count(ref.cell->type) && fabric_lowskew_sinks.at(ref.cell->type).count(ref.port)) return true;
|
||||||
|
return is_fabric_clock_sink(ref);
|
||||||
|
}
|
||||||
|
|
||||||
bool NgUltraImpl::is_ring_clock_sink(const PortRef &ref)
|
bool NgUltraImpl::is_ring_clock_sink(const PortRef &ref)
|
||||||
{
|
{
|
||||||
return ring_clock_sinks.count(ref.cell->type) && ring_clock_sinks.at(ref.cell->type).count(ref.port);
|
return ring_clock_sinks.count(ref.cell->type) && ring_clock_sinks.at(ref.cell->type).count(ref.port);
|
||||||
|
@ -76,6 +76,7 @@ public:
|
|||||||
std::string tile_name(int tile) const;
|
std::string tile_name(int tile) const;
|
||||||
|
|
||||||
bool is_fabric_clock_sink(const PortRef &ref);
|
bool is_fabric_clock_sink(const PortRef &ref);
|
||||||
|
bool is_fabric_lowskew_sink(const PortRef &ref);
|
||||||
bool is_ring_clock_sink(const PortRef &ref);
|
bool is_ring_clock_sink(const PortRef &ref);
|
||||||
bool is_ring_over_tile_clock_sink(const PortRef &ref);
|
bool is_ring_over_tile_clock_sink(const PortRef &ref);
|
||||||
bool is_tube_clock_sink(const PortRef &ref);
|
bool is_tube_clock_sink(const PortRef &ref);
|
||||||
@ -94,6 +95,7 @@ public:
|
|||||||
dict<BelId, IdString> unused_wfg;
|
dict<BelId, IdString> unused_wfg;
|
||||||
dict<BelId, IdString> unused_pll;
|
dict<BelId, IdString> unused_pll;
|
||||||
dict<BelId, BelId> dsp_cascade;
|
dict<BelId, BelId> dsp_cascade;
|
||||||
|
dict<IdString,int> lowskew_signals;
|
||||||
|
|
||||||
TESTABLE_PRIVATE:
|
TESTABLE_PRIVATE:
|
||||||
void write_bitstream_json(const std::string &filename);
|
void write_bitstream_json(const std::string &filename);
|
||||||
|
@ -1619,7 +1619,7 @@ void NgUltraPacker::insert_ioms()
|
|||||||
if (uarch->global_capable_bels.count(bel)==0)
|
if (uarch->global_capable_bels.count(bel)==0)
|
||||||
continue;
|
continue;
|
||||||
for (const auto &usr : ni->users) {
|
for (const auto &usr : ni->users) {
|
||||||
if (uarch->is_fabric_clock_sink(usr) || uarch->is_ring_clock_sink(usr) || uarch->is_tube_clock_sink(usr) || uarch->is_ring_over_tile_clock_sink(usr)) {
|
if (uarch->is_fabric_lowskew_sink(usr) || uarch->is_ring_clock_sink(usr) || uarch->is_tube_clock_sink(usr) || uarch->is_ring_over_tile_clock_sink(usr)) {
|
||||||
pins_needing_iom.emplace_back(ni->name);
|
pins_needing_iom.emplace_back(ni->name);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -2252,6 +2252,38 @@ void NgUltraPacker::pre_place(void)
|
|||||||
assign_wfg(ckg, IdString(), grp.at(i));
|
assign_wfg(ckg, IdString(), grp.at(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (auto &cell : ctx->cells) {
|
||||||
|
auto ci = cell.second.get();
|
||||||
|
if (ci->type == id_BEYOND_FE) {
|
||||||
|
NetInfo *clock = ci->getPort(id_CK);
|
||||||
|
NetInfo *load = ci->getPort(id_L);
|
||||||
|
NetInfo *reset = ci->getPort(id_R);
|
||||||
|
if (clock)
|
||||||
|
uarch->lowskew_signals[clock->name]++;
|
||||||
|
if (load)
|
||||||
|
uarch->lowskew_signals[load->name]++;
|
||||||
|
if (reset)
|
||||||
|
uarch->lowskew_signals[reset->name]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
log_info("Adding GCK for lowskew signals..\n");
|
||||||
|
for(auto &n : uarch->lowskew_signals) {
|
||||||
|
NetInfo *net = ctx->nets.at(n.first).get();
|
||||||
|
if (net->driver.cell->type.in(id_BFR,id_DFR,id_DDFR)) {
|
||||||
|
CellInfo *bfr = net->driver.cell;
|
||||||
|
CellInfo *gck_cell = create_cell_ptr(id_GCK, ctx->idf("%s$csc", bfr->name.c_str(ctx)));
|
||||||
|
gck_cell->params[id_std_mode] = Property("CSC");
|
||||||
|
NetInfo *new_out = ctx->createNet(ctx->id(bfr->name.str(ctx) + "$bfr"));
|
||||||
|
NetInfo *old = bfr->getPort(id_O);
|
||||||
|
bfr->disconnectPort(id_O);
|
||||||
|
gck_cell->connectPort(id_SO, old);
|
||||||
|
gck_cell->connectPort(id_CMD, new_out);
|
||||||
|
bfr->connectPort(id_O, new_out);
|
||||||
|
log_info(" Create GCK '%s' for signal '%s'\n",gck_cell->name.c_str(ctx), n.first.c_str(ctx));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NgUltraImpl::disable_beyond_fe_s_output(BelId bel)
|
void NgUltraImpl::disable_beyond_fe_s_output(BelId bel)
|
||||||
@ -2365,7 +2397,7 @@ void NgUltraPacker::duplicate_gck()
|
|||||||
log_info(" Lowskew signal '%s'\n", glb_net->name.c_str(ctx));
|
log_info(" Lowskew signal '%s'\n", glb_net->name.c_str(ctx));
|
||||||
dict<int, std::vector<PortRef>> connections;
|
dict<int, std::vector<PortRef>> connections;
|
||||||
for (const auto &usr : glb_net->users) {
|
for (const auto &usr : glb_net->users) {
|
||||||
if (uarch->is_fabric_clock_sink(usr) || uarch->is_ring_over_tile_clock_sink(usr)) {
|
if (uarch->is_fabric_lowskew_sink(usr) || uarch->is_ring_over_tile_clock_sink(usr)) {
|
||||||
if (usr.cell->bel==BelId()) {
|
if (usr.cell->bel==BelId()) {
|
||||||
log_error("Cell '%s' not placed\n",usr.cell->name.c_str(ctx));
|
log_error("Cell '%s' not placed\n",usr.cell->name.c_str(ctx));
|
||||||
}
|
}
|
||||||
@ -2426,7 +2458,7 @@ void NgUltraPacker::insert_bypass_gck()
|
|||||||
log_info(" Lowskew signal '%s'\n", glb_net->name.c_str(ctx));
|
log_info(" Lowskew signal '%s'\n", glb_net->name.c_str(ctx));
|
||||||
dict<int, std::vector<PortRef>> connections;
|
dict<int, std::vector<PortRef>> connections;
|
||||||
for (const auto &usr : glb_net->users) {
|
for (const auto &usr : glb_net->users) {
|
||||||
if (uarch->is_fabric_clock_sink(usr) || uarch->is_ring_over_tile_clock_sink(usr)) {
|
if (uarch->is_fabric_lowskew_sink(usr) || uarch->is_ring_over_tile_clock_sink(usr)) {
|
||||||
if (usr.cell->bel==BelId()) {
|
if (usr.cell->bel==BelId()) {
|
||||||
log_error("Cell '%s' not placed\n",usr.cell->name.c_str(ctx));
|
log_error("Cell '%s' not placed\n",usr.cell->name.c_str(ctx));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user