ecp5: Helper function and arch tweaks for global router
Signed-off-by: David Shah <davey1576@gmail.com>
This commit is contained in:
parent
f1aa7093fe
commit
30f122854a
@ -579,4 +579,10 @@ std::vector<std::pair<std::string, std::string>> Arch::getTilesAtLocation(int ro
|
||||
return ret;
|
||||
}
|
||||
|
||||
GlobalInfoPOD Arch::globalInfoAtLoc(Location loc)
|
||||
{
|
||||
int locidx = loc.y * chip_info->width + loc.x;
|
||||
return chip_info->location_glbinfo[locidx];
|
||||
}
|
||||
|
||||
NEXTPNR_NAMESPACE_END
|
||||
|
23
ecp5/arch.h
23
ecp5/arch.h
@ -640,6 +640,21 @@ struct Arch : BaseCtx
|
||||
return range;
|
||||
}
|
||||
|
||||
IdString getWireBasename(WireId wire) const { return id(locInfo(wire)->wire_data[wire.index].name.get()); }
|
||||
|
||||
WireId getWireByLocAndBasename(Location loc, std::string basename) const
|
||||
{
|
||||
WireId wireId;
|
||||
wireId.location = loc;
|
||||
for (int i = 0; i < locInfo(wireId)->num_wires; i++) {
|
||||
if (locInfo(wireId)->wire_data[i].name.get() == basename) {
|
||||
wireId.index = i;
|
||||
return wireId;
|
||||
}
|
||||
}
|
||||
return WireId();
|
||||
}
|
||||
|
||||
// -------------------------------------------------
|
||||
|
||||
PipId getPipByName(IdString name) const;
|
||||
@ -891,6 +906,14 @@ struct Arch : BaseCtx
|
||||
}
|
||||
NPNR_ASSERT_FALSE_STR("no tile at (" + std::to_string(col) + ", " + std::to_string(row) + ") with type in set");
|
||||
}
|
||||
|
||||
GlobalInfoPOD globalInfoAtLoc(Location loc);
|
||||
|
||||
IdString id_trellis_slice;
|
||||
IdString id_clk, id_lsr;
|
||||
IdString id_clkmux, id_lsrmux;
|
||||
IdString id_srmode, id_mode;
|
||||
|
||||
};
|
||||
|
||||
NEXTPNR_NAMESPACE_END
|
||||
|
52
ecp5/globals.cc
Normal file
52
ecp5/globals.cc
Normal file
@ -0,0 +1,52 @@
|
||||
/*
|
||||
* nextpnr -- Next Generation Place and Route
|
||||
*
|
||||
* Copyright (C) 2018 David Shah <david@symbioticeda.com>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "nextpnr.h"
|
||||
|
||||
NEXTPNR_NAMESPACE_BEGIN
|
||||
|
||||
class Ecp5GlobalRouter
|
||||
{
|
||||
public:
|
||||
Ecp5GlobalRouter(Context *ctx) : ctx(ctx){};
|
||||
|
||||
PipId find_tap_pip(WireId tile_glb)
|
||||
{
|
||||
std::string wireName = ctx->getWireBasename(tile_glb).str(ctx);
|
||||
std::string glbName = wireName.substr(2);
|
||||
TapDirection td = ctx->globalInfoAtLoc(tile_glb.location).tap_dir;
|
||||
WireId tap_wire;
|
||||
Location tap_loc;
|
||||
tap_loc.x = ctx->globalInfoAtLoc(tile_glb.location).tap_col;
|
||||
tap_loc.y = tile_glb.location.y;
|
||||
if (td == TAP_DIR_LEFT) {
|
||||
tap_wire = ctx->getWireByLocAndBasename(tap_loc, "L_" + glbName);
|
||||
} else {
|
||||
tap_wire = ctx->getWireByLocAndBasename(tap_loc, "R_" + glbName);
|
||||
}
|
||||
return *(ctx->getPipsUphill(tap_wire).begin());
|
||||
}
|
||||
|
||||
private:
|
||||
Context *ctx;
|
||||
};
|
||||
|
||||
void route_ecp5_globals(Context *ctx);
|
||||
|
||||
NEXTPNR_NAMESPACE_END
|
Loading…
Reference in New Issue
Block a user