diff options
| author | Eddie Hung <eddie.hung+gitlab@gmail.com> | 2018-07-24 01:19:09 +0000 | 
|---|---|---|
| committer | Eddie Hung <eddie.hung+gitlab@gmail.com> | 2018-07-24 01:19:09 +0000 | 
| commit | 30ec1cfbd7dd02578fa2a3e33612e863f01ea959 (patch) | |
| tree | e77d130f96c8061374318f036856aa73d431017d /common/archcheck.cc | |
| parent | eeb93d6eda613c0946867118c1ff93f2462e417f (diff) | |
| parent | 771edd1fda8692930e186a8913b7588d18fda710 (diff) | |
| download | nextpnr-30ec1cfbd7dd02578fa2a3e33612e863f01ea959.tar.gz nextpnr-30ec1cfbd7dd02578fa2a3e33612e863f01ea959.tar.bz2 nextpnr-30ec1cfbd7dd02578fa2a3e33612e863f01ea959.zip  | |
Merge branch 'redist_slack' into 'redist_slack'
Update budgets during routing
See merge request SymbioticEDA/nextpnr!15
Diffstat (limited to 'common/archcheck.cc')
| -rw-r--r-- | common/archcheck.cc | 146 | 
1 files changed, 146 insertions, 0 deletions
diff --git a/common/archcheck.cc b/common/archcheck.cc new file mode 100644 index 00000000..5c4ef26c --- /dev/null +++ b/common/archcheck.cc @@ -0,0 +1,146 @@ +/* + *  nextpnr -- Next Generation Place and Route + * + *  Copyright (C) 2018  Clifford Wolf <clifford@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" +#include "log.h" + +#if 0 +#define dbg(...) log(__VA_ARGS__) +#else +#define dbg(...) +#endif + +USING_NEXTPNR_NAMESPACE + +namespace { + +void archcheck_names(const Context *ctx) +{ +    log_info("Checking entity names.\n"); + +    log_info("Checking bel names..\n"); +    for (BelId bel : ctx->getBels()) { +        IdString name = ctx->getBelName(bel); +        BelId bel2 = ctx->getBelByName(name); +        log_assert(bel == bel2); +    } + +    log_info("Checking wire names..\n"); +    for (WireId wire : ctx->getWires()) { +        IdString name = ctx->getWireName(wire); +        WireId wire2 = ctx->getWireByName(name); +        log_assert(wire == wire2); +    } + +    log_info("Checking pip names..\n"); +    for (PipId pip : ctx->getPips()) { +        IdString name = ctx->getPipName(pip); +        PipId pip2 = ctx->getPipByName(name); +        log_assert(pip == pip2); +    } + +    log_break(); +} + +void archcheck_locs(const Context *ctx) +{ +    log_info("Checking location data.\n"); + +    log_info("Checking all bels..\n"); +    for (BelId bel : ctx->getBels()) { +        log_assert(bel != BelId()); +        dbg("> %s\n", ctx->getBelName(bel).c_str(ctx)); + +        Loc loc = ctx->getBelLocation(bel); +        dbg("   ... %d %d %d\n", loc.x, loc.y, loc.z); + +        log_assert(0 <= loc.x); +        log_assert(0 <= loc.y); +        log_assert(0 <= loc.z); +        log_assert(loc.x < ctx->getGridDimX()); +        log_assert(loc.y < ctx->getGridDimY()); +        log_assert(loc.z < ctx->getTileDimZ(loc.x, loc.y)); + +        BelId bel2 = ctx->getBelByLocation(loc); +        dbg("   ... %s\n", ctx->getBelName(bel2).c_str(ctx)); +        log_assert(bel == bel2); +    } + +    log_info("Checking all locations..\n"); +    for (int x = 0; x < ctx->getGridDimX(); x++) +        for (int y = 0; y < ctx->getGridDimY(); y++) +        { +            dbg("> %d %d\n", x, y); +            std::unordered_set<int> usedz; + +            for (int z = 0; z < ctx->getTileDimZ(x, y); z++) { +                BelId bel = ctx->getBelByLocation(Loc(x, y, z)); +                if (bel == BelId()) +                    continue; +                Loc loc = ctx->getBelLocation(bel); +                dbg("   + %d %s\n", z, ctx->getBelName(bel).c_str(ctx)); +                log_assert(x == loc.x); +                log_assert(y == loc.y); +                log_assert(z == loc.z); +                usedz.insert(z); +            } + +            for (BelId bel : ctx->getBelsByTile(x, y)) { +                Loc loc = ctx->getBelLocation(bel); +                dbg("   - %d %s\n", loc.z, ctx->getBelName(bel).c_str(ctx)); +                log_assert(x == loc.x); +                log_assert(y == loc.y); +                log_assert(usedz.count(loc.z)); +                usedz.erase(loc.z); +            } + +            log_assert(usedz.empty()); +        } + +    log_break(); +} + +void archcheck_conn(const Context *ctx) +{ +#if 0 +    log_info("Checking connectivity data.\n"); + +    log_info("Checking all wires..\n"); +    for (WireId wire : ctx->getWires()) +    { +        ... +    } +#endif +} + +} // namespace + +NEXTPNR_NAMESPACE_BEGIN + +void Context::archcheck() const +{ +    log_info("Running architecture database integrity check.\n"); +    log_break(); + +    archcheck_names(this); +    archcheck_locs(this); +    archcheck_conn(this); +} + +NEXTPNR_NAMESPACE_END  | 
