如何在模块内部从端口开始执行深度优先搜索(DFS)?

时间:2016-05-20 15:34:52

标签: yosys

我正在尝试实现一个新的传递来计算Yosys中给定模块的顺序深度和复杂性。为此,我受到了scc pass的启发。 为了实现它,我需要从模块的输入端口开始专门执行DFS。为此,我试图找到所有立即连接到输入端口的单元。我从模块的端口开始,找到关联线:

SigPool inputPorts;
for (auto &it : module->ports) 
  if (module->wires_[it]->port_input)  
     inputPorts.add((sigmap(RTLIL::SigSpec(module->wires_[it]))));

但我遇到的问题是我无法找到从那里立即连接到输入端口的单元格(在wires / sigspec / sigpool类型中没有用于此目的的APR)。

非常感谢任何帮助/提示。

2 个答案:

答案 0 :(得分:1)

我能够按如下方式实现该部分,但是我不确定它是否是最佳方式。任何建议/意见将不胜感激。

select pharm_name, count(1) as "Number of Staff"
from pharmacies p, pharmacy_staff_store pss
where p.pharm_id = pss.pharmacy_id
group by pharm_name;

答案 1 :(得分:1)

我认为以下代码示例(尽管不是DFS)应该包含您需要的所有相关的惯用Yosys代码片段:

    // create canonical versions of all sigbits
    SigMap sigmap(module);

    // first layer of bits
    pool<SigBit> input_bits;

    for (auto wire : module->wires())
        if (wire->port_input)
            for (auto bit : sigmap(wire))
                input_bits.insert(bit);

    // index: from sigbit to driven cells
    dict<SigBit, pool<Cell*>> bit2cells;

    // index: from cell to driven sigbits
    dict<Cell*, pool<SigBit>> cell2bits;

    for (auto cell : module->cells())
    for (auto &conn : cell->connections()) {
        if (cell->input(conn.first)) {
            for (auto bit : sigmap(conn.second))
                bit2cells[bit].insert(cell);
        }
        if (cell->output(conn.first)) {
            for (auto bit : sigmap(conn.second))
                cell2bits[cell].insert(bit);
        }
    }

    pool<SigBit> queue = input_bits;
    pool<Cell*> visited_cells;

    while (!queue.empty())
    {
        log("------\n");

        pool<Cell*> this_iter_cells;

        for (auto bit : queue)
        for (auto cell : bit2cells[bit])
            if (!visited_cells.count(cell)) {
                log("  %s\n", log_id(cell));
                visited_cells.insert(cell);
                this_iter_cells.insert(cell);
            }

        queue.clear();
        for (auto cell : this_iter_cells)
        for (auto bit : cell2bits[cell])
            queue.insert(bit);
    }

最重要的事情是:

  • 使用SigMap创建信号位的规范表示(如果两条线相互连接且只是#34;别名和#34;对于相同的实际位)。

  • 分两个阶段分解算法:(1)创建所需的索引结构,(2)执行实际算法。

您可能还会发现thisthis问题的答案很有用。

(我匆忙写下这个答案。如果有任何不清楚的地方,请在下面的评论中提出进一步的问题。)