Program Listing for File HierNetlist.hpp

Return to documentation for file (ckpttncpp/HierNetlist.hpp)

#pragma once

// import networkx as nx
// #include <algorithm>
// #include <gsl/span>
// #include <iterator>
// #include <py2cpp/py2cpp.hpp>
// #include <utility>
// #include <vector>
// #include <xnetwork/classes/graph.hpp>
#include "netlist.hpp"
#include "array_like.hpp"

// using node_t = int;

// struct PartInfo
// {
//     std::vector<std::uint8_t> part;
//     py::set<node_t> extern_nets;
// };

template <typename graph_t>
class HierNetlist : public Netlist<graph_t>
{
  public:
    using nodeview_t = typename graph_t::nodeview_t;
    using node_t = typename graph_t::node_t;
    using index_t = typename nodeview_t::key_type;

    /* For multi-level algorithms */
    const Netlist<graph_t>* parent;
    std::vector<node_t> node_up_map;
    std::vector<node_t> node_down_map;
    py::dict<index_t, node_t> cluster_down_map;
    shift_array<std::vector<int>> net_weight{};


    HierNetlist(graph_t G, const nodeview_t& modules, const nodeview_t& nets);

    // HierNetlist(graph_t G, uint32_t numModules, uint32_t numNets);

    void projection_down(gsl::span<const std::uint8_t> part,
        gsl::span<std::uint8_t> part_down) const;

    void projection_up(gsl::span<const std::uint8_t> part,
        gsl::span<std::uint8_t> part_up) const;

    auto get_net_weight(const node_t& net) const -> int
    {
        return this->net_weight.empty() ? 1
                                        :
                                        this->net_weight[net];
    }
};

template <typename graph_t>
HierNetlist<graph_t>::HierNetlist(
    graph_t G, const nodeview_t& modules, const nodeview_t& nets)
    : Netlist<graph_t> {std::move(G), modules, nets}
{
}

// template <typename graph_t>
// HierNetlist<graph_t>::HierNetlist(graph_t G, uint32_t numModules, uint32_t numNets)
//     : Netlist<graph_t> {std::move(G), py::range<uint32_t>(numModules),
//           py::range<uint32_t>(numModules, numModules + numNets)}
// {
// }

using SimpleHierNetlist = HierNetlist<xn::SimpleGraph>;