calyx_opt/passes/
dump_ports.rs1use calyx_ir::{self as ir, RRC, WRC};
2use ir::rewriter;
3use itertools::Itertools;
4use std::rc::Rc;
5
6#[derive(Default)]
7pub struct DumpResults {
9 pub cells: Vec<RRC<ir::Cell>>,
11 pub rewrites: rewriter::PortRewriteMap,
14}
15
16pub(super) fn format_port_name(canon: &ir::Canonical) -> ir::Id {
18 format!("{}_{}", canon.cell, canon.port).into()
19}
20
21pub(super) fn dump_ports_to_signature<F>(
27 component: &mut ir::Component,
28 cell_filter: F,
29 remove_clk_and_reset: bool,
30) -> DumpResults
31where
32 F: Fn(&RRC<ir::Cell>) -> bool,
33{
34 let mut removed = rewriter::PortRewriteMap::default();
35
36 let (ext_cells, cells): (Vec<_>, Vec<_>) =
37 component.cells.drain().partition(cell_filter);
38 component.cells.append(cells.into_iter());
39
40 for cell_ref in &ext_cells {
41 let cell = cell_ref.borrow();
42 log::debug!("cell `{}' removed", cell.name());
43 let is_data_cell = cell.attributes.has(ir::BoolAttr::Data);
46
47 let ports_inline = cell
51 .ports
52 .iter()
53 .filter(|pr| {
54 if remove_clk_and_reset {
55 let p = pr.borrow();
56 !p.attributes.has(ir::BoolAttr::Clk)
57 && !p.attributes.has(ir::BoolAttr::Reset)
58 } else {
59 true
60 }
61 })
62 .map(Rc::clone)
63 .collect_vec();
64
65 for port_ref in ports_inline {
66 let canon = port_ref.borrow().canonical();
67 let port = port_ref.borrow();
68 let new_port_attrs =
72 if is_data_cell & port.attributes.has(ir::BoolAttr::Data) {
73 let mut attrs = ir::Attributes::default();
74 attrs.insert(ir::BoolAttr::Data, 1);
75 attrs
76 } else {
77 ir::Attributes::default()
78 };
79
80 let new_port = ir::rrc(ir::Port {
81 name: component.generate_name(format_port_name(&canon)),
82 width: port.width,
83 direction: port.direction.clone(),
84 parent: ir::PortParent::Cell(WRC::from(&component.signature)),
85 attributes: new_port_attrs,
86 });
87 component
88 .signature
89 .borrow_mut()
90 .ports
91 .push(Rc::clone(&new_port));
92
93 removed.insert(canon.clone(), Rc::clone(&new_port));
95 }
96 }
97 DumpResults {
98 cells: ext_cells,
99 rewrites: removed,
100 }
101}