diff options
Diffstat (limited to 'machxo2')
| -rw-r--r-- | machxo2/arch.cc | 10 | ||||
| -rw-r--r-- | machxo2/arch.h | 1 | ||||
| -rw-r--r-- | machxo2/arch_pybindings.cc | 79 | ||||
| -rw-r--r-- | machxo2/arch_pybindings.h | 98 | ||||
| -rw-r--r-- | machxo2/family.cmake | 6 | 
5 files changed, 188 insertions, 6 deletions
| diff --git a/machxo2/arch.cc b/machxo2/arch.cc index 21129f07..df9b7efc 100644 --- a/machxo2/arch.cc +++ b/machxo2/arch.cc @@ -111,6 +111,16 @@ Arch::Arch(ArchArgs args) : args(args)  bool Arch::is_available(ArchArgs::ArchArgsTypes chip) { return get_chip_info(chip) != nullptr; } +std::vector<std::string> Arch::get_supported_packages(ArchArgs::ArchArgsTypes chip) +{ +    const ChipInfoPOD *chip_info = get_chip_info(chip); +    std::vector<std::string> pkgs; +    for (int i = 0; i < chip_info->num_packages; i++) { +        pkgs.push_back(chip_info->package_info[i].name.get()); +    } +    return pkgs; +} +  std::string Arch::getChipName() const  {      if (args.type == ArchArgs::LCMXO2_256HC) { diff --git a/machxo2/arch.h b/machxo2/arch.h index 937157f3..f1642490 100644 --- a/machxo2/arch.h +++ b/machxo2/arch.h @@ -424,6 +424,7 @@ struct Arch : BaseArch<ArchRanges>      Arch(ArchArgs args);      static bool is_available(ArchArgs::ArchArgsTypes chip); +    static std::vector<std::string> get_supported_packages(ArchArgs::ArchArgsTypes chip);      std::string getChipName() const override;      // Extra helper diff --git a/machxo2/arch_pybindings.cc b/machxo2/arch_pybindings.cc new file mode 100644 index 00000000..fa0f9535 --- /dev/null +++ b/machxo2/arch_pybindings.cc @@ -0,0 +1,79 @@ +/* + *  nextpnr -- Next Generation Place and Route + * + *  Copyright (C) 2018  Claire Xen <claire@symbioticeda.com> + *  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. + * + */ + +#ifndef NO_PYTHON + +#include "arch_pybindings.h" +#include "nextpnr.h" +#include "pybindings.h" + +NEXTPNR_NAMESPACE_BEGIN + +void arch_wrap_python(py::module &m) +{ +    using namespace PythonConversion; +    py::class_<ArchArgs>(m, "ArchArgs").def_readwrite("type", &ArchArgs::type); + +    py::class_<BelId>(m, "BelId").def_readwrite("index", &BelId::index); + +    py::class_<WireId>(m, "WireId").def_readwrite("index", &WireId::index); + +    py::class_<PipId>(m, "PipId").def_readwrite("index", &PipId::index); + +    auto arch_cls = py::class_<Arch, BaseCtx>(m, "Arch").def(py::init<ArchArgs>()); +    auto ctx_cls = py::class_<Context, Arch>(m, "Context") +                           .def("checksum", &Context::checksum) +                           .def("pack", &Context::pack) +                           .def("place", &Context::place) +                           .def("route", &Context::route); + +    fn_wrapper_2a<Context, decltype(&Context::isValidBelForCell), &Context::isValidBelForCell, pass_through<bool>, +                  addr_and_unwrap<CellInfo>, conv_from_str<BelId>>::def_wrap(ctx_cls, "isValidBelForCell"); + +    typedef std::unordered_map<IdString, std::unique_ptr<CellInfo>> CellMap; +    typedef std::unordered_map<IdString, std::unique_ptr<NetInfo>> NetMap; +    typedef std::unordered_map<IdString, IdString> AliasMap; +    typedef std::unordered_map<IdString, HierarchicalCell> HierarchyMap; + +    auto belpin_cls = py::class_<ContextualWrapper<BelPin>>(m, "BelPin"); +    readonly_wrapper<BelPin, decltype(&BelPin::bel), &BelPin::bel, conv_to_str<BelId>>::def_wrap(belpin_cls, "bel"); +    readonly_wrapper<BelPin, decltype(&BelPin::pin), &BelPin::pin, conv_to_str<IdString>>::def_wrap(belpin_cls, "pin"); + +    typedef const PipRange UphillPipRange; +    typedef const PipRange DownhillPipRange; + +    typedef const std::vector<BelBucketId> &BelBucketRange; +    typedef const std::vector<BelId> &BelRangeForBelBucket; +#include "arch_pybindings_shared.h" + +    WRAP_RANGE(m, Bel, conv_to_str<BelId>); +    WRAP_RANGE(m, Wire, conv_to_str<WireId>); +    WRAP_RANGE(m, AllPip, conv_to_str<PipId>); +    WRAP_RANGE(m, Pip, conv_to_str<PipId>); +    WRAP_RANGE(m, BelPin, wrap_context<BelPin>); + +    WRAP_MAP_UPTR(m, CellMap, "IdCellMap"); +    WRAP_MAP_UPTR(m, NetMap, "IdNetMap"); +    WRAP_MAP(m, HierarchyMap, wrap_context<HierarchicalCell &>, "HierarchyMap"); +} + +NEXTPNR_NAMESPACE_END + +#endif // NO_PYTHON diff --git a/machxo2/arch_pybindings.h b/machxo2/arch_pybindings.h new file mode 100644 index 00000000..62f66406 --- /dev/null +++ b/machxo2/arch_pybindings.h @@ -0,0 +1,98 @@ +/* + *  nextpnr -- Next Generation Place and Route + * + *  Copyright (C) 2018  Claire Xen <claire@symbioticeda.com> + *  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. + * + */ +#ifndef ARCH_PYBINDINGS_H +#define ARCH_PYBINDINGS_H +#ifndef NO_PYTHON + +#include "nextpnr.h" +#include "pybindings.h" + +NEXTPNR_NAMESPACE_BEGIN + +namespace PythonConversion { + +template <> struct string_converter<BelId> +{ +    BelId from_str(Context *ctx, std::string name) { return ctx->getBelByNameStr(name); } + +    std::string to_str(Context *ctx, BelId id) +    { +        if (id == BelId()) +            throw bad_wrap(); +        return ctx->getBelName(id).str(ctx); +    } +}; + +template <> struct string_converter<WireId> +{ +    WireId from_str(Context *ctx, std::string name) { return ctx->getWireByNameStr(name); } + +    std::string to_str(Context *ctx, WireId id) +    { +        if (id == WireId()) +            throw bad_wrap(); +        return ctx->getWireName(id).str(ctx); +    } +}; + +template <> struct string_converter<const WireId> +{ +    WireId from_str(Context *ctx, std::string name) { return ctx->getWireByNameStr(name); } + +    std::string to_str(Context *ctx, WireId id) +    { +        if (id == WireId()) +            throw bad_wrap(); +        return ctx->getWireName(id).str(ctx); +    } +}; + +template <> struct string_converter<PipId> +{ +    PipId from_str(Context *ctx, std::string name) { return ctx->getPipByNameStr(name); } + +    std::string to_str(Context *ctx, PipId id) +    { +        if (id == PipId()) +            throw bad_wrap(); +        return ctx->getPipName(id).str(ctx); +    } +}; + +template <> struct string_converter<BelPin> +{ +    BelPin from_str(Context *ctx, std::string name) +    { +        NPNR_ASSERT_FALSE("string_converter<BelPin>::from_str not implemented"); +    } + +    std::string to_str(Context *ctx, BelPin pin) +    { +        if (pin.bel == BelId()) +            throw bad_wrap(); +        return ctx->getBelName(pin.bel).str(ctx) + "/" + pin.pin.str(ctx); +    } +}; + +} // namespace PythonConversion + +NEXTPNR_NAMESPACE_END +#endif +#endif diff --git a/machxo2/family.cmake b/machxo2/family.cmake index b898e396..76c5df93 100644 --- a/machxo2/family.cmake +++ b/machxo2/family.cmake @@ -1,9 +1,3 @@ -if (BUILD_GUI) -    message(FATAL_ERROR "GUI support is not implemented for MachXO2. Build with -DBUILD_GUI=OFF.") -endif() -if (BUILD_PYTHON) -    message(FATAL_ERROR "Python support is not implemented for MachXO2. Build with -DBUILD_PYTHON=OFF.") -endif()  add_subdirectory(${family})  message(STATUS "Using MachXO2 chipdb: ${MACHXO2_CHIPDB}") | 
