Skip to content

Planar ortho pr#852

Open
hibenj wants to merge 111 commits intocda-tum:mainfrom
hibenj:planar_ortho_pr
Open

Planar ortho pr#852
hibenj wants to merge 111 commits intocda-tum:mainfrom
hibenj:planar_ortho_pr

Conversation

@hibenj
Copy link
Collaborator

@hibenj hibenj commented Oct 7, 2025

Description

This PR includes the files for planarization of networks via node duplication and for the planar placement and routing.
Not: It also contains files for check_planarity, which checks if a given planar embedding has no crossings. This could also be checked using mincross from PR #736.

Fixes # (issue)

Checklist:

  • The pull request only contains commits that are related to it.
  • I have added appropriate tests and documentation.
  • I have added a changelog entry.
  • I have created/adjusted the Python bindings for any new or updated functionality.
  • I have made sure that all CI jobs on GitHub pass.
  • The pull request introduces no new warnings and follows the project's style guidelines.

Summary by CodeRabbit

  • New Features

    • Node Duplication Planarization API for planarizing and duplicating network nodes
    • Planar Layout from Network Embedding (PLANE) for generating gate-level planar layouts
    • New PLANE CLI command to run the full physical-design flow
  • Documentation

    • Extensive API docstrings added across layout, routing, geometry, simulation, and planarization interfaces
  • Tests

    • Comprehensive tests validating planarization, layout generation, equivalence, zero crossings, and error cases

✏️ Tip: You can customize this high-level summary in your review settings.

actions-user and others added 27 commits January 2, 2025 14:43
Signed-off-by: GitHub Actions <actions@github.com>
# Conflicts:
#	bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp
Signed-off-by: GitHub Actions <actions@github.com>
Signed-off-by: GitHub Actions <actions@github.com>
Signed-off-by: GitHub Actions <actions@github.com>
Signed-off-by: GitHub Actions <actions@github.com>
Signed-off-by: GitHub Actions <actions@github.com>
@hibenj hibenj self-assigned this Oct 7, 2025
@hibenj hibenj requested a review from marcelwa October 7, 2025 12:01
Signed-off-by: GitHub Actions <actions@github.com>
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (2)
bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp (2)

17499-17499: Consider expanding po_order documentation.

The docstring for po_order is minimal. Per the past review suggestion, consider clarifying its purpose: e.g., "Explicit primary output order to use when output_order == RANDOM_PO_ORDER. If empty, an internal random permutation is chosen."


6075-6077: Empty docstrings for connect_and_place helpers remain unaddressed.

These empty docstrings were flagged in a previous review. If these are internal helpers not intended for Python users, consider excluding them from the bindings. Otherwise, add at least a brief description of their purpose.

🧹 Nitpick comments (4)
include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp (1)

1-3: Migrate "Created by" comment to Doxygen tags.

Per coding guidelines, use @file and @author tags in Doxygen comments instead of // Created by ... comments.

-//
-// Created by benjamin on 21.01.25.
-//
+/**
+ * @file planar_layout_from_network_embedding.hpp
+ * @brief Planar layout generation from network embedding (PLANE) algorithm.
+ * @author Benjamin Hibler
+ */
include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp (2)

1-3: Migrate "Created by" comment to Doxygen tags.

Per coding guidelines, use @file and @author tags in Doxygen comments instead of // Created by ... comments.

-//
-// Created by benjamin on 11.06.24.
-//
+/**
+ * @file node_duplication_planarization.hpp
+ * @brief Node duplication planarization for crossing minimization (NDCE).
+ * @author Benjamin Hibler
+ */

297-304: Consider runtime validation instead of assert for fanin arity.

The assert at lines 297-299 is compiled out in release builds. For robustness, consider throwing an exception on mismatch to catch logic errors at runtime.

-                // Ensure child count matches function arity (including 0-fanin constants)
-                assert(children.size() == ntk.fanin_size(nd) &&
-                       "Mismatch between gathered children and node fanin count");
+                // Ensure child count matches function arity (including 0-fanin constants)
+                if (children.size() != ntk.fanin_size(nd))
+                {
+                    throw std::runtime_error("Mismatch between gathered children and node fanin count");
+                }
cli/cmd/physical_design/src/plane.cpp (1)

1-3: Migrate "Created by" comment to Doxygen tags.

Per coding guidelines, use @file and @author tags in Doxygen comments.

-//
-// Created by benjamin on 21.11.25.
-//
+/**
+ * @file plane.cpp
+ * @brief CLI command for planar embedding and layout generation.
+ * @author Benjamin Hibler
+ */
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 46c38b1 and c180359.

📒 Files selected for processing (5)
  • bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp (11 hunks)
  • cli/cmd/physical_design/src/plane.cpp (1 hunks)
  • include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp (1 hunks)
  • include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp (1 hunks)
  • test/algorithms/physical_design/planar_layout_from_network_embedding.cpp (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{cpp,hpp,cc,cxx,h}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{cpp,hpp,cc,cxx,h}: Use snake_case for namespaces, functions, variables, classes, structs, and filenames in C++
Use PascalCase for C++ template parameters (e.g., template <typename Spec, typename Impl>)
Use UPPER_SNAKE_CASE for C++ macros
Apply Doxygen documentation (/** ... */) to ALL new and edited C++ code symbols (members, aliases, functions, classes, etc.)
Use modern Doxygen commands (@brief, @param, @return, @tparam, @file, @author, @ref, @see, @throws) in C++ documentation
Plan migration away from // Created by ... comments in C++ files; use @file and @author tags in Doxygen comments instead
Use const correctness throughout C++ code
Prefer STL algorithms over custom algorithms in C++
Use braced initialization in C++
Never use using namespace std; in C++ code

Files:

  • bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp
  • test/algorithms/physical_design/planar_layout_from_network_embedding.cpp
  • include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp
  • include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp
  • cli/cmd/physical_design/src/plane.cpp
**/*.hpp

📄 CodeRabbit inference engine (AGENTS.md)

Use .hpp extension for C++ header files and include guards with #ifndef FICTION_FILENAME_HPP format

Files:

  • bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp
  • include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp
  • include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp
🧠 Learnings (6)
📓 Common learnings
Learnt from: hibenj
Repo: cda-tum/fiction PR: 852
File: include/fiction/algorithms/physical_design/orthogonal_planar.hpp:825-826
Timestamp: 2025-10-13T14:43:13.479Z
Learning: In the fiction library, logic networks are required to have at least one primary input (PI). The `orthogonal_planar` algorithm in `include/fiction/algorithms/physical_design/orthogonal_planar.hpp` enforces this invariant with an assertion rather than handling the zero-PI case.
📚 Learning: 2025-09-25T10:31:01.287Z
Learnt from: marcelwa
Repo: cda-tum/fiction PR: 840
File: bindings/mnt/pyfiction/CMakeLists.txt:30-37
Timestamp: 2025-09-25T10:31:01.287Z
Learning: Headers in the pyfiction Python bindings target (bindings/mnt/pyfiction/) are private implementation details for the Python bindings and should not be made public or exported as part of the C++ API.

Applied to files:

  • bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp
📚 Learning: 2025-10-13T14:43:13.479Z
Learnt from: hibenj
Repo: cda-tum/fiction PR: 852
File: include/fiction/algorithms/physical_design/orthogonal_planar.hpp:825-826
Timestamp: 2025-10-13T14:43:13.479Z
Learning: In the fiction library, logic networks are required to have at least one primary input (PI). The `orthogonal_planar` algorithm in `include/fiction/algorithms/physical_design/orthogonal_planar.hpp` enforces this invariant with an assertion rather than handling the zero-PI case.

Applied to files:

  • test/algorithms/physical_design/planar_layout_from_network_embedding.cpp
  • include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp
  • include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp
📚 Learning: 2025-09-10T16:31:45.364Z
Learnt from: marcelwa
Repo: cda-tum/fiction PR: 828
File: include/fiction/technology/area.hpp:0-0
Timestamp: 2025-09-10T16:31:45.364Z
Learning: In include/fiction/technology/area.hpp, both fiction::area overloads should accept parameters as `const area_params<technology<Lyt>>& ps = {}` to allow binding the default temporary and ensure const-correctness. Docs in docs/technology/properties.rst should mirror these signatures.

Applied to files:

  • include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp
📚 Learning: 2025-12-03T11:45:06.423Z
Learnt from: CR
Repo: cda-tum/fiction PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-03T11:45:06.423Z
Learning: Applies to **/*.{cpp,hpp,cc,cxx,h} : Use `const` correctness throughout C++ code

Applied to files:

  • include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp
📚 Learning: 2025-12-03T11:45:06.423Z
Learnt from: CR
Repo: cda-tum/fiction PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-03T11:45:06.423Z
Learning: Applies to **/*.{cpp,hpp,cc,cxx,h} : Use braced initialization in C++

Applied to files:

  • cli/cmd/physical_design/src/plane.cpp
🧬 Code graph analysis (2)
test/algorithms/physical_design/planar_layout_from_network_embedding.cpp (3)
include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp (1)
  • node_duplication_planarization (769-770)
include/fiction/algorithms/verification/virtual_miter.hpp (1)
  • virtual_miter (77-77)
include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp (2)
  • plane (1144-1180)
  • plane (1144-1145)
include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp (2)
include/fiction/utils/placement_utils.hpp (1)
  • reserve_input_nodes (39-39)
include/fiction/utils/network_utils.hpp (1)
  • high_degree_fanin_exception (255-256)
🪛 Cppcheck (2.18.0)
test/algorithms/physical_design/planar_layout_from_network_embedding.cpp

[information] 1-1: Include file

(missingIncludeSystem)


[information] 2-2: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 9-9: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 9-9: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 9-9: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 9-9: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 4-4: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 26-26: Include file

(missingIncludeSystem)


[information] 27-27: Include file

(missingIncludeSystem)


[information] 28-28: Include file

(missingIncludeSystem)


[information] 29-29: Include file

(missingIncludeSystem)


[information] 30-30: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 23-23: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 26-26: Include file

(missingIncludeSystem)


[information] 27-27: Include file

(missingIncludeSystem)


[information] 28-28: Include file

(missingIncludeSystem)


[information] 29-29: Include file

(missingIncludeSystem)


[information] 30-30: Include file

(missingIncludeSystem)


[information] 31-31: Include file

(missingIncludeSystem)


[information] 32-32: Include file

(missingIncludeSystem)


[information] 33-33: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 26-26: Include file

(missingIncludeSystem)


[information] 27-27: Include file

(missingIncludeSystem)


[information] 28-28: Include file

(missingIncludeSystem)


[information] 29-29: Include file

(missingIncludeSystem)


[information] 31-31: Include file

(missingIncludeSystem)


[information] 32-32: Include file

(missingIncludeSystem)


[information] 33-33: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 9-9: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 23-23: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 9-9: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 9-9: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 23-23: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 23-23: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 23-23: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 23-23: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 26-26: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 26-26: Include file

(missingIncludeSystem)


[information] 27-27: Include file

(missingIncludeSystem)


[information] 28-28: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 23-23: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 26-26: Include file

(missingIncludeSystem)


[information] 27-27: Include file

(missingIncludeSystem)


[information] 28-28: Include file

(missingIncludeSystem)


[information] 29-29: Include file

(missingIncludeSystem)


[information] 30-30: Include file

(missingIncludeSystem)


[information] 31-31: Include file

(missingIncludeSystem)


[information] 32-32: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] Limiting analysis of branches. Use --check-level=exhaustive to analyze all branches.

(normalCheckLevelMaxBranches)


[performance] 100-100: Function parameter 'p' should be passed by const reference.

(passedByValue)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 28-28: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 31-31: Include file

(missingIncludeSystem)


[information] 35-35: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)

cli/cmd/physical_design/src/plane.cpp

[information] 8-8: Include file

(missingIncludeSystem)


[information] 9-9: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 9-9: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 9-9: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 9-9: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 4-4: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 26-26: Include file

(missingIncludeSystem)


[information] 27-27: Include file

(missingIncludeSystem)


[information] 28-28: Include file

(missingIncludeSystem)


[information] 29-29: Include file

(missingIncludeSystem)


[information] 30-30: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 23-23: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 26-26: Include file

(missingIncludeSystem)


[information] 27-27: Include file

(missingIncludeSystem)


[information] 28-28: Include file

(missingIncludeSystem)


[information] 29-29: Include file

(missingIncludeSystem)


[information] 30-30: Include file

(missingIncludeSystem)


[information] 31-31: Include file

(missingIncludeSystem)


[information] 32-32: Include file

(missingIncludeSystem)


[information] 33-33: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 26-26: Include file

(missingIncludeSystem)


[information] 27-27: Include file

(missingIncludeSystem)


[information] 28-28: Include file

(missingIncludeSystem)


[information] 29-29: Include file

(missingIncludeSystem)


[information] 31-31: Include file

(missingIncludeSystem)


[information] 32-32: Include file

(missingIncludeSystem)


[information] 33-33: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 9-9: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 23-23: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 9-9: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 8-8: Include file

(missingIncludeSystem)


[information] 9-9: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 23-23: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 23-23: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 23-23: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 26-26: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 26-26: Include file

(missingIncludeSystem)


[information] 27-27: Include file

(missingIncludeSystem)


[information] 28-28: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 23-23: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 26-26: Include file

(missingIncludeSystem)


[information] 27-27: Include file

(missingIncludeSystem)


[information] 28-28: Include file

(missingIncludeSystem)


[information] 29-29: Include file

(missingIncludeSystem)


[information] 30-30: Include file

(missingIncludeSystem)


[information] 31-31: Include file

(missingIncludeSystem)


[information] 32-32: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingInclude)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 23-23: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 26-26: Include file

(missingIncludeSystem)


[information] 12-12: Include file

(missingInclude)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 23-23: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 26-26: Include file

(missingIncludeSystem)


[information] 27-27: Include file

(missingIncludeSystem)


[information] 28-28: Include file

(missingIncludeSystem)


[information] 29-29: Include file

(missingIncludeSystem)


[information] 30-30: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 22-22: Include file

(missingIncludeSystem)


[information] 23-23: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 10-10: Include file

(missingIncludeSystem)


[information] 11-11: Include file

(missingIncludeSystem)


[information] 13-13: Include file

(missingIncludeSystem)


[information] 14-14: Include file

(missingIncludeSystem)


[information] 15-15: Include file

(missingIncludeSystem)


[information] 16-16: Include file

(missingIncludeSystem)


[information] 17-17: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 18-18: Include file

(missingIncludeSystem)


[information] 19-19: Include file

(missingIncludeSystem)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 21-21: Include file

(missingIncludeSystem)


[information] 23-23: Include file

(missingIncludeSystem)


[information] 24-24: Include file

(missingIncludeSystem)


[information] 25-25: Include file

(missingIncludeSystem)


[information] 26-26: Include file

(missingIncludeSystem)


[information] 27-27: Include file

(missingIncludeSystem)


[error] 71-71: There is an unknown macro here somewhere. Configuration is required. If ALICE_ADD_STORE is a macro then please configure it.

(unknownMacro)


[information] 20-20: Include file

(missingIncludeSystem)


[information] 28-28: Include file

(missingIncludeSystem)


[information] 31-31: Include file

(missingIncludeSystem)


[information] 35-35: Include file

(missingIncludeSystem)

🔇 Additional comments (25)
include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp (3)

865-878: LGTM!

The run() method is well-structured with proper initialization of the layout, node mapping, and PI reservation. The assertion at line 886 correctly enforces the invariant that networks must have at least one PI, as per the project's design requirements.


107-150: LGTM!

The buffer lookup table is well-documented and encapsulates the orientation/spacing logic cleanly. Using a static local variable ensures single initialization.


1143-1180: LGTM!

The public plane() function has proper static assertions, validates planarity via mincross, and correctly propagates statistics when requested.

include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp (5)

68-98: LGTM!

The hgraph_node struct is well-documented with proper Doxygen comments. The constructor uses const& parameters as recommended.


114-137: LGTM!

The initialize_copy_network_duplicates function has proper static assertions with accurate messages, and correctly handles constant mapping and PI creation.


153-215: LGTM!

The gather_fanin_signals function correctly handles type consistency between source and destination networks, and properly preserves complemented edges via create_not.


631-723: LGTM!

The run() method correctly orchestrates level-by-level processing, handles PO ordering (with optional randomization), and properly constructs the virtual PI network with restored names.


768-797: LGTM!

The public node_duplication_planarization function has proper type constraints, validates balance requirements, and verifies planarity of the result.

test/algorithms/physical_design/planar_layout_from_network_embedding.cpp (4)

28-34: LGTM!

The check_stats helper function correctly validates that the layout statistics are populated with non-zero values.


36-69: LGTM!

The check_plane template function provides comprehensive testing of the full pipeline: fanout substitution → balancing → planarization → equivalence checking → layout generation → gate library application.


71-88: LGTM!

The exception tests properly verify that the algorithm rejects networks with unsupported fanin degrees and non-planar inputs.


107-140: LGTM!

The name conservation test verifies that network and output names correctly propagate through balancing, planarization, and layout generation stages.

cli/cmd/physical_design/src/plane.cpp (3)

32-47: LGTM!

The constructor provides a detailed help string explaining the algorithm's workflow and its trade-offs compared to the gold algorithm. Options are well-organized.


49-123: LGTM!

The execute() method has proper validation, uses braced scopes in the switch statement, handles exceptions appropriately, and resets state after execution.


125-132: LGTM!

The log() method returns comprehensive statistics in JSON format, including runtime, gate/wire counts, crossings, and layout dimensions with computed area.

bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp (10)

5035-5053: LGTM!

The docstring for adjust_final_values is well-structured with clear parameter descriptions and purpose explanation.


5240-5298: LGTM!

The calculation helper functions are well-documented with clear return value semantics and parameter descriptions.


5326-5412: LGTM!

Documentation for these calculation helpers is comprehensive with proper parameter and return value descriptions.


6109-6145: LGTM!

The docstring now properly clarifies ntk_lvls as containing original node ranks from the source network, documents ntk_lvls_new correctly, and includes a Returns: section describing the constructed virtual_pi_network. This addresses the previous review concerns.


8021-8033: LGTM!

The lookup table function docstrings adequately describe their purpose and the encoding scheme.


8918-8945: LGTM!

The hgraph_node struct documentation clearly explains its role in crossing minimization and documents the constructor parameters.


9526-9581: LGTM!

The compute_slice_delays and insert_if_not_first docstrings are now comprehensive. Notably, insert_if_not_first correctly clarifies that "No exception is thrown during this process," addressing the previous review concern about inaccurate exception semantics.


10183-10207: LGTM!

The plane_impl class is well-documented with a clear description of the planar layout generation algorithm, including its level-by-level placement and routing approach.


17457-17489: LGTM!

The main node_duplication_planarization function is thoroughly documented with proper academic citation, a clear explanation of the NDCE problem and H-graph approach, and complete parameter/return documentation.


18830-18887: LGTM!

The documentation for planar_layout_from_network_embedding_params, planar_layout_from_network_embedding_stats, and the main plane function is comprehensive. The PLANE methodology is clearly explained with proper template and parameter documentation.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp (1)

1-3: Migrate to Doxygen file documentation.

Replace the "Created by" comment with Doxygen @file and @author tags as per project coding guidelines.

Apply this diff:

-//
-// Created by benjamin on 21.01.25.
-//
+/**
+ * @file planar_layout_from_network_embedding.hpp
+ * @brief Planar layout generation from network embedding (PLANE algorithm)
+ * @author benjamin
+ */
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 643925f and e3c229d.

📒 Files selected for processing (1)
  • include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{cpp,hpp,cc,cxx,h}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{cpp,hpp,cc,cxx,h}: Use snake_case for namespaces, functions, variables, classes, structs, and filenames in C++
Use PascalCase for C++ template parameters (e.g., template <typename Spec, typename Impl>)
Use UPPER_SNAKE_CASE for C++ macros
Apply Doxygen documentation (/** ... */) to ALL new and edited C++ code symbols (members, aliases, functions, classes, etc.)
Use modern Doxygen commands (@brief, @param, @return, @tparam, @file, @author, @ref, @see, @throws) in C++ documentation
Plan migration away from // Created by ... comments in C++ files; use @file and @author tags in Doxygen comments instead
Use const correctness throughout C++ code
Prefer STL algorithms over custom algorithms in C++
Use braced initialization in C++
Never use using namespace std; in C++ code

Files:

  • include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp
**/*.hpp

📄 CodeRabbit inference engine (AGENTS.md)

Use .hpp extension for C++ header files and include guards with #ifndef FICTION_FILENAME_HPP format

Files:

  • include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp
🧠 Learnings (2)
📓 Common learnings
Learnt from: hibenj
Repo: cda-tum/fiction PR: 852
File: include/fiction/algorithms/physical_design/orthogonal_planar.hpp:825-826
Timestamp: 2025-10-13T14:43:13.479Z
Learning: In the fiction library, logic networks are required to have at least one primary input (PI). The `orthogonal_planar` algorithm in `include/fiction/algorithms/physical_design/orthogonal_planar.hpp` enforces this invariant with an assertion rather than handling the zero-PI case.
📚 Learning: 2025-10-13T14:43:13.479Z
Learnt from: hibenj
Repo: cda-tum/fiction PR: 852
File: include/fiction/algorithms/physical_design/orthogonal_planar.hpp:825-826
Timestamp: 2025-10-13T14:43:13.479Z
Learning: In the fiction library, logic networks are required to have at least one primary input (PI). The `orthogonal_planar` algorithm in `include/fiction/algorithms/physical_design/orthogonal_planar.hpp` enforces this invariant with an assertion rather than handling the zero-PI case.

Applied to files:

  • include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp
🧬 Code graph analysis (1)
include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp (2)
include/fiction/utils/placement_utils.hpp (1)
  • reserve_input_nodes (39-39)
include/fiction/utils/network_utils.hpp (1)
  • high_degree_fanin_exception (255-256)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (20)
  • GitHub Check: 🍎 macos-14 with clang++
  • GitHub Check: 🐧 ubuntu-24.04-arm with clang++-16
  • GitHub Check: 🐧 ubuntu-24.04 with clang++-16
  • GitHub Check: 🐧 ubuntu-24.04 with g++-12
  • GitHub Check: 🪟 windows-2022 with v143 toolset
  • GitHub Check: 🪟 windows-2025 with v143 toolset
  • GitHub Check: 🪟 windows-2022 with ClangCL toolset
  • GitHub Check: 🪟 windows-2025 with ClangCL toolset
  • GitHub Check: 🛞 Wheels for ubuntu-24.04-arm
  • GitHub Check: 🛞 Wheels for windows-latest
  • GitHub Check: 🛞 Wheels for ubuntu-24.04
  • GitHub Check: 🛞 Wheels for macos-15
  • GitHub Check: Analyze python
  • GitHub Check: Analyze cpp
  • GitHub Check: 🐳 Build and publish Docker image
  • GitHub Check: Coverage on ubuntu-24.04 with g++-13
  • GitHub Check: 🚨 Clang-Tidy
  • GitHub Check: 🐍 macos-15
  • GitHub Check: 🐍 windows-latest
  • GitHub Check: 🐍 ubuntu-latest
🔇 Additional comments (1)
include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp (1)

45-55: Add Doxygen documentation to struct members.

Per coding guidelines, all struct members require Doxygen documentation. The planar_layout_from_network_embedding_stats struct (lines 59-98) demonstrates the expected format.

Apply this diff:

 struct planar_layout_from_network_embedding_params
 {
     /**
      * Number of clock phases to use. 3 and 4 are supported.
      */
     num_clks number_of_clock_phases = num_clks::FOUR;
     /**
      * Verbosity.
      */
     bool verbose = false;
 };

Based on coding guidelines.

⛔ Skipped due to learnings
Learnt from: CR
Repo: cda-tum/fiction PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-03T11:45:06.423Z
Learning: Applies to **/*.{cpp,hpp,cc,cxx,h} : Use modern Doxygen commands (`brief`, `param`, `return`, `tparam`, `file`, `author`, `ref`, `see`, `throws`) in C++ documentation

Copy link
Collaborator

@marcelwa marcelwa left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for addressing the first batch of comments so swiftly. I have now managed to look at the remainder of the changes, too. Looks pretty good overall. Please find my comments below.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

♻️ Duplicate comments (3)
bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp (2)

6075-6077: Empty docstrings for connect_and_place helpers remain unaddressed.

These helper functions still have empty docstrings R"doc()doc", despite being flagged in previous reviews. Please add at least one-line descriptions of their purpose, parameters, and side effects, or exclude them from the Python bindings if they are internal implementation details not intended for Python users.

Based on past review comments, as these are internal helpers for placement and routing, minimal documentation such as the following would suffice:

-static const char *__doc_fiction_detail_connect_and_place = R"doc()doc";
+static const char *__doc_fiction_detail_connect_and_place =
+R"doc(Connects network nodes within a level according to the computed placement
+and updates the layout accordingly. Internal helper.)doc";
 
-static const char *__doc_fiction_detail_connect_and_place_2 = R"doc()doc";
+static const char *__doc_fiction_detail_connect_and_place_2 =
+R"doc(Variant of connect_and_place handling alternative routing cases. Internal
+helper; not part of the public API.)doc";

9526-9553: Missing border_pis parameter documentation.

The docstring for compute_slice_delays documents only the nd parameter but omits the bool border_pis flag. According to past review comments, this function takes a border_pis parameter (see include/fiction/algorithms/network_transformation/detail/node_duplication_planarization.hpp, Line 451). Please add documentation explaining how this boolean flag influences the slice delay calculation.

Suggested addition:

 Parameter ``nd``:
-    Node in the H-graph.)doc";
+    Node in the H-graph.
+
+Parameter ``border_pis``:
+    A boolean indicating whether the input PIs (Primary Inputs) should 
+    be propagated to the next level.)doc";
include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp (1)

305-307: Replace assert with runtime error check.

Asserts are compiled out in release builds. Use a runtime check to ensure create_node is never called with wrong arity, which would cause undefined behavior.

🔎 Apply this diff:
-                // Ensure child count matches function arity (including 0-fanin constants)
-                assert(children.size() == ntk.fanin_size(nd) &&
-                       "Mismatch between gathered children and node fanin count");
+                // Ensure child count matches function arity (including 0-fanin constants)
+                if (children.size() != ntk.fanin_size(nd))
+                {
+                    throw std::runtime_error("Mismatch between gathered children and node fanin count");
+                }
🧹 Nitpick comments (5)
bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp (2)

9524-9524: Empty docstring for implementation class.

The node_duplication_planarization_impl class has an empty docstring. Consider adding a brief description of the class's role in the planarization algorithm, or mark this as an internal implementation detail not exposed to Python users.


17504-17512: Consider enhancing po_order parameter description.

The po_order parameter is documented but could be more explicit about when and how it's used. The current description states it defaults to KEEP_PO_ORDER, but doesn't clarify its role when output_order == RANDOM_PO_ORDER.

Consider expanding the description:

-static const char *__doc_fiction_node_duplication_planarization_params_po_order = R"doc(The output order used. Defaults to KEEP_PO_ORDER.)doc";
+static const char *__doc_fiction_node_duplication_planarization_params_po_order = 
+R"doc(Explicit primary output order to use when output_order == RANDOM_PO_ORDER. 
+If empty, an internal random permutation is chosen. Defaults to KEEP_PO_ORDER.)doc";
cli/cmd/physical_design/src/plane.cpp (1)

1-3: Consider migrating to @file and @author Doxygen tags.

Per coding guidelines, plan migration away from // Created by ... comments in favor of Doxygen documentation.

cli/cmd/physical_design/include/plane.hpp (1)

1-3: Consider migrating to @file and @author Doxygen tags.

Per coding guidelines, plan migration away from // Created by ... comments in favor of Doxygen documentation.

include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp (1)

1-3: Migrate "Created by" comment to Doxygen format.

Per coding guidelines, replace the "Created by" comment with Doxygen @file and @author tags.

🔎 Apply this diff:
-//
-// Created by benjamin on 11.06.24.
-//
+/**
+ * @file node_duplication_planarization.hpp
+ * @author benjamin
+ * @brief Implements node duplication planarization for logic networks.
+ */
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e3c229d and 76857e8.

📒 Files selected for processing (5)
  • bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp (11 hunks)
  • cli/cmd/physical_design/include/plane.hpp (1 hunks)
  • cli/cmd/physical_design/src/plane.cpp (1 hunks)
  • docs/changelog.rst (1 hunks)
  • include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/changelog.rst
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{cpp,hpp,cc,cxx,h}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{cpp,hpp,cc,cxx,h}: Use snake_case for namespaces, functions, variables, classes, structs, and filenames in C++
Use PascalCase for C++ template parameters (e.g., template <typename Spec, typename Impl>)
Use UPPER_SNAKE_CASE for C++ macros
Apply Doxygen documentation (/** ... */) to ALL new and edited C++ code symbols (members, aliases, functions, classes, etc.)
Use modern Doxygen commands (@brief, @param, @return, @tparam, @file, @author, @ref, @see, @throws) in C++ documentation
Plan migration away from // Created by ... comments in C++ files; use @file and @author tags in Doxygen comments instead
Use const correctness throughout C++ code
Prefer STL algorithms over custom algorithms in C++
Use braced initialization in C++
Never use using namespace std; in C++ code

Files:

  • bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp
  • cli/cmd/physical_design/include/plane.hpp
  • cli/cmd/physical_design/src/plane.cpp
  • include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp
**/*.hpp

📄 CodeRabbit inference engine (AGENTS.md)

Use .hpp extension for C++ header files and include guards with #ifndef FICTION_FILENAME_HPP format

Files:

  • bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp
  • cli/cmd/physical_design/include/plane.hpp
  • include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp
🧠 Learnings (7)
📓 Common learnings
Learnt from: hibenj
Repo: cda-tum/fiction PR: 852
File: include/fiction/algorithms/physical_design/orthogonal_planar.hpp:825-826
Timestamp: 2025-10-13T14:43:13.479Z
Learning: In the fiction library, logic networks are required to have at least one primary input (PI). The `orthogonal_planar` algorithm in `include/fiction/algorithms/physical_design/orthogonal_planar.hpp` enforces this invariant with an assertion rather than handling the zero-PI case.
📚 Learning: 2025-09-25T10:31:01.287Z
Learnt from: marcelwa
Repo: cda-tum/fiction PR: 840
File: bindings/mnt/pyfiction/CMakeLists.txt:30-37
Timestamp: 2025-09-25T10:31:01.287Z
Learning: Headers in the pyfiction Python bindings target (bindings/mnt/pyfiction/) are private implementation details for the Python bindings and should not be made public or exported as part of the C++ API.

Applied to files:

  • bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp
📚 Learning: 2025-12-03T11:45:06.423Z
Learnt from: CR
Repo: cda-tum/fiction PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-03T11:45:06.423Z
Learning: Applies to **/*.py : Use Google-style docstrings for Python functions and classes

Applied to files:

  • bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp
📚 Learning: 2025-10-13T14:43:13.479Z
Learnt from: hibenj
Repo: cda-tum/fiction PR: 852
File: include/fiction/algorithms/physical_design/orthogonal_planar.hpp:825-826
Timestamp: 2025-10-13T14:43:13.479Z
Learning: In the fiction library, logic networks are required to have at least one primary input (PI). The `orthogonal_planar` algorithm in `include/fiction/algorithms/physical_design/orthogonal_planar.hpp` enforces this invariant with an assertion rather than handling the zero-PI case.

Applied to files:

  • bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp
  • include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp
📚 Learning: 2025-12-03T11:45:06.423Z
Learnt from: CR
Repo: cda-tum/fiction PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-03T11:45:06.423Z
Learning: Applies to **/*.{cpp,hpp,cc,cxx,h} : Use braced initialization in C++

Applied to files:

  • cli/cmd/physical_design/src/plane.cpp
📚 Learning: 2025-09-10T16:31:45.364Z
Learnt from: marcelwa
Repo: cda-tum/fiction PR: 828
File: include/fiction/technology/area.hpp:0-0
Timestamp: 2025-09-10T16:31:45.364Z
Learning: In include/fiction/technology/area.hpp, both fiction::area overloads should accept parameters as `const area_params<technology<Lyt>>& ps = {}` to allow binding the default temporary and ensure const-correctness. Docs in docs/technology/properties.rst should mirror these signatures.

Applied to files:

  • include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp
📚 Learning: 2025-12-03T11:45:06.423Z
Learnt from: CR
Repo: cda-tum/fiction PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-03T11:45:06.423Z
Learning: Applies to **/*.{cpp,hpp,cc,cxx,h} : Use `const` correctness throughout C++ code

Applied to files:

  • include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp
🧬 Code graph analysis (1)
cli/cmd/physical_design/src/plane.cpp (3)
cli/cmd/physical_design/include/plane.hpp (1)
  • plane_command (34-34)
include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp (1)
  • node_duplication_planarization (810-811)
include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp (2)
  • plane (1145-1181)
  • plane (1145-1146)
🪛 Cppcheck (2.18.0)
cli/cmd/physical_design/src/plane.cpp

[error] 71-71: There is an unknown macro here somewhere. Configuration is required. If ALICE_ADD_STORE is a macro then please configure it.

(unknownMacro)

🔇 Additional comments (18)
bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp (11)

5035-5053: LGTM! Well-documented function.

The docstring for adjust_final_values clearly explains the function's purpose, parameters, and behavior. The description effectively conveys the minimal routing demand identification logic.


5240-5298: LGTM! Comprehensive documentation.

All three helper functions (calculate_allowed_orientation, calculate_buffer_connection_type, calculate_fanout_connection_type) are thoroughly documented with clear explanations of their return codes and parameter semantics.


5326-5413: LGTM! Clear and complete documentation.

All four calculation helper functions are well-documented with proper template parameter specifications, parameter descriptions, and return value explanations.


6060-6073: LGTM! Function properly documented.

The compute_two_input_indices function is clearly documented with appropriate template parameters, parameters, and return value descriptions.


6109-6145: LGTM! Previous issues resolved.

The docstring for create_virtual_pi_ntk_from_duplicated_nodes now consistently describes ntk_lvls as containing original node ranks from the source network, properly documents ntk_lvls_new, and includes a clear return value description. The previous inconsistencies have been addressed.


8021-8033: LGTM! Lookup table functions documented.

Both get_buffer_lookup and get_fanout_lookup have clear docstrings explaining their 3D lookup table structure and purpose.


8918-8945: LGTM! H-graph node structure well-documented.

The hgraph_node structure and its members are thoroughly documented, including the template parameter, constructor parameters, and member variable semantics.


9564-9590: LGTM! Semantics clarified.

The updated docstring for insert_if_not_first now correctly states "No exception is thrown during this process" and accurately describes the insertion behavior based on saturated_fanout_flag and position. The previous misleading exception reference has been removed.


10200-10224: LGTM! Algorithm implementation well-documented.

The plane_impl class docstring provides a comprehensive description of the planar layout generation algorithm, including its level-by-level approach, template parameters, and parameters. The explanation clearly conveys the algorithm's purpose and operation.


17474-17502: LGTM! Algorithm thoroughly documented.

The node_duplication_planarization function docstring provides excellent coverage of the algorithm, including its basis in the referenced paper, the NDCE problem it solves, the H-graph approach, and clear parameter/return documentation.


18843-18900: LGTM! PLANE methodology thoroughly documented.

The planar_layout_from_network_embedding_params, statistics struct, and plane function are all comprehensively documented. The docstring for plane provides excellent context about the PLANE methodology, its approach to preserving planar embeddings, and the mapping from logic levels to layout diagonals.

cli/cmd/physical_design/src/plane.cpp (4)

32-47: LGTM!

The constructor properly initializes parameters and configures CLI options with appropriate descriptions.


69-87: LGTM!

The switch statement correctly maps user input to internal enum values with braced scopes and full enum names. Good defensive handling with the default case.


101-117: Verify behavior of gls.extend() on exception.

If plane() throws, the gls.extend() = ... assignment is not completed. Depending on alice's store implementation, this could leave a dangling or null entry in the store. Consider calling plane() first, storing the result, then extending the store only on success.

🔎 Suggested refactor
     try
     {
-        gls.extend() = std::make_shared<fiction::cart_gate_clk_lyt>(
-            fiction::plane<fiction::cart_gate_clk_lyt>(planarized_ntk, ps, &st));
+        auto result = fiction::plane<fiction::cart_gate_clk_lyt>(planarized_ntk, ps, &st);
+        gls.extend() = std::make_shared<fiction::cart_gate_clk_lyt>(std::move(result));
     }

124-131: LGTM!

The log() function provides comprehensive statistics including runtime, gate/wire counts, crossings, and layout dimensions.

cli/cmd/physical_design/include/plane.hpp (3)

5-16: LGTM!

Include guard follows the FICTION_*_HPP convention and all necessary headers are included.


20-25: LGTM!

The docstring clearly explains the PLANE acronym (Planar Layout from Network Embedding) and references the algorithm header for details. This addresses the previous reviewer's feedback about stating the acronym.


26-78: LGTM!

The class definition follows coding guidelines with proper Doxygen documentation, braced initialization, explicit constructor, and appropriate use of the dedicated planar_layout_from_network_embedding_stats class (addressing the past reviewer concern about stats class reuse).

Comment on lines +60 to +65
if (num_clock_phases != 3u && num_clock_phases != 4u)
{
env->out() << "[e] only 3- and 4-phase clocking schemes are supported\n";
ps = {};
return;
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Inconsistent parameter reset on error path.

On invalid clock phases, only ps is reset, but fan_ps, bal_ps, and dup_ps are not. Conversely, at the end of execute() (lines 119-121), only those three are reset but not ps. Consider resetting all parameters consistently in both locations to avoid stale state across invocations.

🔎 Suggested fix
     if (num_clock_phases != 3u && num_clock_phases != 4u)
     {
         env->out() << "[e] only 3- and 4-phase clocking schemes are supported\n";
-        ps = {};
+        fan_ps = {};
+        bal_ps = {};
+        dup_ps = {};
+        ps     = {};
         return;
     }

And at end of execute():

     fan_ps = {};
     bal_ps = {};
     dup_ps = {};
+    ps     = {};
 }

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In cli/cmd/physical_design/src/plane.cpp around lines 60-65, the error path for
unsupported num_clock_phases only resets ps but leaves fan_ps, bal_ps, and
dup_ps stale; likewise at the end of execute() (around lines 119-121) only
fan_ps, bal_ps, and dup_ps are cleared while ps is left. Fix by consistently
clearing all four parameters (ps, fan_ps, bal_ps, dup_ps) in both places so any
early return or normal exit leaves no stale state.

/**
* The output order used. Defaults to KEEP_PO_ORDER.
*/
output_order po_order = output_order::KEEP_PO_ORDER;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

Add Doxygen documentation for po_order member.

All struct members should have Doxygen documentation per coding guidelines.

🔎 Apply this diff:
     /**
      * The output order used. Defaults to KEEP_PO_ORDER.
      */
     output_order po_order = output_order::KEEP_PO_ORDER;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
output_order po_order = output_order::KEEP_PO_ORDER;
/**
* The output order used. Defaults to KEEP_PO_ORDER.
*/
output_order po_order = output_order::KEEP_PO_ORDER;
🤖 Prompt for AI Agents
In
include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp
around line 52, the struct member "po_order" lacks Doxygen documentation; add a
concise Doxygen comment immediately above the declaration that explains the
purpose of this member (controls the output ordering behavior), lists or
references the possible enum values (e.g., output_order::KEEP_PO_ORDER and other
options), and any default behavior or effects; use the project's Doxygen style
(/// or /** */) and keep the comment one or two short sentences.

Comment on lines +58 to +59
template <typename Ntk>
using levelized_node_order = std::vector<std::vector<mockturtle::node<Ntk>>>;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

Add Doxygen documentation for levelized_node_order type alias.

All type aliases should have Doxygen documentation per coding guidelines.

🔎 Apply this diff:
+/**
+ * A type alias representing a levelized ordering of nodes in a network.
+ * Each inner vector contains nodes at a specific level (rank).
+ */
 template <typename Ntk>
 using levelized_node_order = std::vector<std::vector<mockturtle::node<Ntk>>>;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
template <typename Ntk>
using levelized_node_order = std::vector<std::vector<mockturtle::node<Ntk>>>;
/**
* A type alias representing a levelized ordering of nodes in a network.
* Each inner vector contains nodes at a specific level (rank).
*/
template <typename Ntk>
using levelized_node_order = std::vector<std::vector<mockturtle::node<Ntk>>>;
🤖 Prompt for AI Agents
In
include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp
around lines 58 to 59, the type alias levelized_node_order lacks Doxygen
documentation; add a brief Doxygen comment immediately above the alias that
explains what the alias represents (a vector of levels where each level is a
vector of mockturtle::node<Ntk>), documents the template parameter Ntk, and
describes intended use/semantics (e.g., ordering of nodes by level for
duplication/planarization algorithms) following project Doxygen style.

Comment on lines +97 to +100
hgraph_node(const mockturtle::node<Ntk>& first, const mockturtle::node<Ntk>& last, const uint64_t delay_value) :
outer_fanins(first, last),
delay(delay_value)
{}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

Use const references for constructor parameters.

Per const correctness guidelines, node parameters should be const &.

🔎 Apply this diff:
-    hgraph_node(const mockturtle::node<Ntk>& first, const mockturtle::node<Ntk>& last, const uint64_t delay_value) :
+    hgraph_node(const mockturtle::node<Ntk>& first, const mockturtle::node<Ntk>& last, uint64_t delay_value) :
             outer_fanins(first, last),
             delay(delay_value)
     {}

Note: uint64_t is a primitive type and should be passed by value, not by const reference. Only the node parameters benefit from const & (which they already have).

🤖 Prompt for AI Agents
In
include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp
around lines 97 to 100, the constructor currently declares the integer parameter
as const uint64_t delay_value; change it to uint64_t delay_value (remove the
const) so the primitive is passed by value while keeping the
mockturtle::node<Ntk> parameters as const references; leave the initializer list
and member assignments unchanged.

{
if (!ntk.is_constant(fi))
{
auto n = ntk.get_node(fi);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

Rename shadowing variable to avoid confusion.

Line 438 declares a local variable n that shadows the function parameter n (line 423), which can lead to bugs and confusion.

🔎 Apply this diff:
-                                  auto n = ntk.get_node(fi);
+                                  const auto fi_node = ntk.get_node(fi);
 
                                   auto it =
-                                      std::lower_bound(fis.begin(), fis.end(), n, [&](auto const& a, auto const& b)
+                                      std::lower_bound(fis.begin(), fis.end(), fi_node, [&](auto const& a, auto const& b)
                                                        { return ntk.rank_position(a) < ntk.rank_position(b); });
 
-                                  fis.insert(it, n);
+                                  fis.insert(it, fi_node);
🤖 Prompt for AI Agents
In
include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp
around line 438, the local variable declared as "n" shadows the function
parameter "n" (declared at line 423); rename the local variable to a
non-conflicting, descriptive name (e.g., fi_node, child_node or node_local) and
update all subsequent references at and after line 438 to use the new name so
the parameter is no longer shadowed.

Comment on lines +694 to +697
// Generate a random engine
static std::mt19937_64 generator(std::random_device{}());
// Shuffle the pos vector
std::shuffle(pos.begin(), pos.end(), generator);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Document thread-safety assumptions for concurrent calls to this method.

A single PRNG across multiple threads without locking is not thread-safe. The static generator is accessed without synchronization, which could cause data races if run() is called concurrently from multiple threads. Either document that this algorithm is not thread-safe, or protect generator access with a mutex/lock or use thread-local storage for thread-safety.

🤖 Prompt for AI Agents
In
include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp
around lines 694-697, the static std::mt19937_64 generator is used without
synchronization which is unsafe if run() is called concurrently; either document
that this method is not thread-safe or make generator access safe — preferred
fixes: replace the static generator with a function-local generator seeded
per-call (e.g., construct a local std::mt19937_64 seeded from std::random_device
or a thread-safe seed source), or declare the generator thread_local, or guard
access with a mutex around std::shuffle; update comments to state the
thread-safety choice you make.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (2)
bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp (2)

6075-6077: Empty docstrings remain for connect_and_place helpers.

These empty docstrings were already flagged in a previous review. The functions should either be documented or excluded from Python bindings if they are internal helpers not intended for end users.


9512-9539: Missing border_pis parameter documentation.

Previous reviews flagged that compute_slice_delays takes a bool border_pis parameter that should be documented. The current docstring only documents the nd parameter, leaving the border_pis parameter unexplained.

🧹 Nitpick comments (9)
include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp (9)

1-6: Consider migrating to Doxygen-style file documentation.

As per the coding guidelines, replace the // Created by ... comment with @file and @author Doxygen tags.

Suggested change:
-//
-// Created by benjamin on 21.01.25.
-//
-
+/**
+ * @file planar_layout_from_network_embedding.hpp
+ * @brief Planar layout generation from network embedding.
+ * @author Benjamin Hien
+ */
+
 #ifndef FICTION_PLANAR_LAYOUT_FROM_NETWORK_EMBEDDING_HPP
 #define FICTION_PLANAR_LAYOUT_FROM_NETWORK_EMBEDDING_HPP

256-258: Use proper node type in lambda comparator.

The lambda comparator uses int for node parameters, but mockturtle::node<Ntk> may be a larger unsigned type. This could cause truncation or unexpected comparison behavior.

Suggested change:
     auto fo = ntk.fanout(n);
     assert(fo.size() == 2);
-    std::sort(fo.begin(), fo.end(), [&ntk](int a, int b) { return ntk.rank_position(a) < ntk.rank_position(b); });
+    std::sort(fo.begin(), fo.end(), [&ntk](const auto& a, const auto& b) { return ntk.rank_position(a) < ntk.rank_position(b); });

300-325: Use proper types in lambda and return statement.

  1. The lambda comparator uses int for node parameters.
  2. The return statement uses std::min<uint64_t> but the function returns uint8_t, causing implicit narrowing.
Suggested changes:
     if (fc.fanin_nodes.size() == 2)
     {
         std::sort(fc.fanin_nodes.begin(), fc.fanin_nodes.end(),
-                  [&ntk](int a, int b) { return ntk.rank_position(a) < ntk.rank_position(b); });
+                  [&ntk](const auto& a, const auto& b) { return ntk.rank_position(a) < ntk.rank_position(b); });
     }
     assert(pre1_t.y > pre2_t.y);
-    return std::min<uint64_t>(pre1_t.y - pre2_t.y - 1, 2);
+    return static_cast<uint8_t>(std::min<uint64_t>(pre1_t.y - pre2_t.y - 1, 2));

337-358: Consider returning bool and fix lambda parameter types.

The function only returns 0 or 1, so bool is more appropriate than uint64_t. Additionally, the lambda comparator should use proper node types.

Suggested changes:
 template <typename Ntk>
-uint64_t calculate_buffer_connection_type(const Ntk& ntk, const mockturtle::node<Ntk>& n)
+bool calculate_buffer_connection_type(const Ntk& ntk, const mockturtle::node<Ntk>& n)
 {
     if (ntk.is_po(n))
     {
-        return 0;
+        return false;
     }
     auto fo = ntk.fanout(n);
     assert(fo.size() == 1);
     if (ntk.fanin_size(fo[0]) == 2)
     {
         auto fc  = fanins(ntk, fo[0]);
         auto pre = fc.fanin_nodes;
         assert(pre.size() == 2);
-        std::sort(pre.begin(), pre.end(), [&ntk](int a, int b) { return ntk.rank_position(a) < ntk.rank_position(b); });
+        std::sort(pre.begin(), pre.end(), [&ntk](const auto& a, const auto& b) { return ntk.rank_position(a) < ntk.rank_position(b); });
         if (pre[1] == n)
         {
-            return 1;
+            return true;
         }
     }
-    return 0;
+    return false;
 }

Note: If you change the return type, you'll also need to update the lookup table indexing at line 527-529 to cast the boolean to an integer index.


383-385: Use proper node types in lambda comparator.

Suggested change:
         auto fo = ntk.fanout(pre);
         assert(fo.size() == 2);
-        std::sort(fo.begin(), fo.end(), [&ntk](int a, int b) { return ntk.rank_position(a) < ntk.rank_position(b); });
+        std::sort(fo.begin(), fo.end(), [&ntk](const auto& a, const auto& b) { return ntk.rank_position(a) < ntk.rank_position(b); });

411-412: Consider using uint8_t return type for consistency.

The function only returns values 0, 1, or 3 (via the expression at line 446). Using uint8_t would be consistent with other similar helper functions.


558-565: Remove unused lambda capture.

The lambda captures lvl by reference but never uses it.

Suggested change:
     ntk.foreach_node_in_rank(lvl,
-                             [&ntk, &two_input_indices, &lvl](const auto& n, const auto& i)
+                             [&ntk, &two_input_indices](const auto& n, const auto& i)
                              {
                                  if (ntk.fanin_size(n) == 2)
                                  {
                                      two_input_indices.emplace_back(i);
                                  }
                              });

591-594: Use proper node types in lambda comparator.

Suggested change:
                                  if (fc.fanin_nodes.size() == 2)
                                  {
-                                     std::sort(fc.fanin_nodes.begin(), fc.fanin_nodes.end(), [&ntk](int a, int b)
+                                     std::sort(fc.fanin_nodes.begin(), fc.fanin_nodes.end(), [&ntk](const auto& a, const auto& b)
                                                { return ntk.rank_position(a) < ntk.rank_position(b); });

1030-1032: Consider using bool for add_line.

The variable add_line only holds values 0 or 1, so bool would be more semantically appropriate.

Suggested change:
         // place and route POs
         mockturtle::node_map<uint8_t, Ntk> count_map{ntk, 0};
-        int                                add_line = 0;
+        bool                               add_line = false;

Then update line 1049 to add_line = true; and line 1079 to use add_line ? 1 : 0 or cast appropriately.

📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 76857e8 and f71bb36.

📒 Files selected for processing (2)
  • bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp (10 hunks)
  • include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp (1 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{cpp,hpp,cc,cxx,h}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{cpp,hpp,cc,cxx,h}: Use snake_case for namespaces, functions, variables, classes, structs, and filenames in C++
Use PascalCase for C++ template parameters (e.g., template <typename Spec, typename Impl>)
Use UPPER_SNAKE_CASE for C++ macros
Apply Doxygen documentation (/** ... */) to ALL new and edited C++ code symbols (members, aliases, functions, classes, etc.)
Use modern Doxygen commands (@brief, @param, @return, @tparam, @file, @author, @ref, @see, @throws) in C++ documentation
Plan migration away from // Created by ... comments in C++ files; use @file and @author tags in Doxygen comments instead
Use const correctness throughout C++ code
Prefer STL algorithms over custom algorithms in C++
Use braced initialization in C++
Never use using namespace std; in C++ code

Files:

  • bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp
  • include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp
**/*.hpp

📄 CodeRabbit inference engine (AGENTS.md)

Use .hpp extension for C++ header files and include guards with #ifndef FICTION_FILENAME_HPP format

Files:

  • bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp
  • include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp
🧠 Learnings (5)
📓 Common learnings
Learnt from: hibenj
Repo: cda-tum/fiction PR: 852
File: include/fiction/algorithms/physical_design/orthogonal_planar.hpp:825-826
Timestamp: 2025-10-13T14:43:13.479Z
Learning: In the fiction library, logic networks are required to have at least one primary input (PI). The `orthogonal_planar` algorithm in `include/fiction/algorithms/physical_design/orthogonal_planar.hpp` enforces this invariant with an assertion rather than handling the zero-PI case.
📚 Learning: 2025-09-25T10:31:01.287Z
Learnt from: marcelwa
Repo: cda-tum/fiction PR: 840
File: bindings/mnt/pyfiction/CMakeLists.txt:30-37
Timestamp: 2025-09-25T10:31:01.287Z
Learning: Headers in the pyfiction Python bindings target (bindings/mnt/pyfiction/) are private implementation details for the Python bindings and should not be made public or exported as part of the C++ API.

Applied to files:

  • bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp
📚 Learning: 2025-12-03T11:45:06.423Z
Learnt from: CR
Repo: cda-tum/fiction PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-03T11:45:06.423Z
Learning: Applies to **/*.py : Use Google-style docstrings for Python functions and classes

Applied to files:

  • bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp
  • include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp
📚 Learning: 2025-10-13T14:43:13.479Z
Learnt from: hibenj
Repo: cda-tum/fiction PR: 852
File: include/fiction/algorithms/physical_design/orthogonal_planar.hpp:825-826
Timestamp: 2025-10-13T14:43:13.479Z
Learning: In the fiction library, logic networks are required to have at least one primary input (PI). The `orthogonal_planar` algorithm in `include/fiction/algorithms/physical_design/orthogonal_planar.hpp` enforces this invariant with an assertion rather than handling the zero-PI case.

Applied to files:

  • bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp
  • include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp
📚 Learning: 2025-10-13T11:04:24.736Z
Learnt from: marcelwa
Repo: cda-tum/fiction PR: 854
File: cli/cmd/logic/src/abc.cpp:78-88
Timestamp: 2025-10-13T11:04:24.736Z
Learning: The `mockturtle::write_aiger` function in the mockturtle library supports writing all kinds of logic networks (AIG, XAG, MIG, TEC), not just AIG networks. No explicit conversion to AIG is required before calling this function.

Applied to files:

  • include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp
🔇 Additional comments (17)
include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp (6)

42-98: LGTM!

The parameter and statistics structs are well-documented with Doxygen comments, use braced initialization, and the report() method provides clear formatted output.


103-231: LGTM!

The lookup tables are appropriately declared as inline constexpr, use UPPER_SNAKE_CASE naming, and are well-documented with Doxygen comments explaining their purpose.


467-543: LGTM!

The function is well-documented and correctly computes placement/routing variables using the lookup tables. The assertions properly validate array bounds.


607-828: LGTM!

The wiring computation functions are well-documented. The previous concern about out-of-bounds access at line 785 has been addressed with the guard (i < two_input_new_lines.size()) ? two_input_new_lines[i] : 0.


1039-1070: LGTM!

The PO placement logic correctly addresses previous review concerns:

  • Uses ntk.get_node(po) to get the driving node
  • Uses mockturtle::node_map with proper typing for count_map
  • Properly checks for has_output_name_v before accessing output names
  • Throws std::logic_error instead of assert(false) for the error case

1143-1180: LGTM!

The public plane function properly:

  • Validates type constraints with static_assert
  • Checks for high-degree fan-in nodes
  • Validates planarity using mincross
  • Handles statistics output correctly
bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp (11)

5035-5053: LGTM!

The docstring is complete, clear, and properly documents the function's purpose and all parameters.


5240-5298: LGTM!

All three function docstrings are complete and well-structured, with clear descriptions of parameters, template parameters, and return values.


5326-5412: LGTM!

All function docstrings are complete, well-documented, and follow a consistent format.


6060-6073: LGTM!

The compute_two_input_indices docstring is complete and properly documents the function's purpose, template parameter, parameters, and return value.


6109-6145: LGTM! Previous issues resolved.

The docstring now properly clarifies that ntk_lvls contains original node ranks from the source network, ntk_lvls_new contains newly created node ranks, and the return value is documented. The previous inconsistencies have been addressed.


8904-8932: LGTM!

The H-graph node structure and its members are well-documented, with clear descriptions of purpose, fields, and constructor parameters.


9550-9576: LGTM! Previous issue resolved.

The docstring has been updated to clarify that no exception is thrown, and properly explains the insertion behavior based on the saturated_fanout_flag and position parameters.


9541-9549: LGTM!

The enum documentation for fanout_state and insertion_position, along with their values and member variables, is clear and complete.

Also applies to: 9578-9591


10186-10222: LGTM!

The plane_impl class and its members are thoroughly documented, with a detailed explanation of the algorithm, template parameters, and all member variables.


17460-17498: LGTM!

The node_duplication_planarization function and its parameters are well-documented. The main function includes a detailed algorithm explanation with proper citations, and all parameters and enums are documented.


18829-18886: LGTM!

The planar_layout_from_network_embedding parameters, statistics, and main plane function are comprehensively documented with clear descriptions of the PLANE methodology, all parameters, and return values.


ntk.foreach_node_in_rank(
lvl,
[&ntk, &node2pos, &lvl, &orientation, &new_lines, &buffer_lu, &fanout_lu](const auto& n, const auto i)

Check failure

Code scanning / CodeQL

Potentially uninitialized local variable High

The variable
buffer_lu
may not be initialized at this access.

ntk.foreach_node_in_rank(
lvl,
[&ntk, &node2pos, &lvl, &orientation, &new_lines, &buffer_lu, &fanout_lu](const auto& n, const auto i)

Check failure

Code scanning / CodeQL

Potentially uninitialized local variable High

The variable
fanout_lu
may not be initialized at this access.
Copilot AI review requested due to automatic review settings January 19, 2026 09:17
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Fix all issues with AI agents
In
`@include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp`:
- Line 215: Fix the typo in the inline comment that currently reads "// THis
adjusts for virtual PIS" by changing "THis" to "This" so it reads "// This
adjusts for virtual PIS"; locate this comment in
include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp
(the line containing the exact text "THis adjusts for virtual PIS") and update
it accordingly.
- Line 129: The static_assert using mockturtle::has_rank_position_v<Ntk> is
malformed (it uses && with the message string), so replace the logical-AND
pattern with the correct static_assert syntax that takes the trait as the first
argument and the message string as the second; update the static_assert
referencing mockturtle::has_rank_position_v<Ntk> and the message "Ntk does not
implement the rank_position function" accordingly.
- Around line 844-846: The static_assert messages incorrectly reference "NtkSrc"
instead of the actual template parameter name `Ntk`; update the three
static_assert messages that mention mockturtle::is_network_type_v<Ntk>,
mockturtle::has_create_node_v<Ntk>, and mockturtle::has_rank_position_v<Ntk> to
refer to "Ntk" (e.g., "Ntk is not a network type", "Ntk does not implement the
create_node function", "Ntk does not implement the rank_position function") so
the error text matches the template parameter name used in
node_duplication_planarization.hpp.
♻️ Duplicate comments (5)
include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp (5)

58-59: Add Doxygen documentation for levelized_node_order type alias.

Per coding guidelines, all type aliases should have Doxygen documentation.

🔧 Suggested change
+/**
+ * `@brief` A levelized ordering of nodes in a network.
+ *
+ * Each inner vector contains nodes at a specific level (rank), ordered from outputs to inputs.
+ *
+ * `@tparam` Ntk Network type from which node types are drawn.
+ */
 template <typename Ntk>
 using levelized_node_order = std::vector<std::vector<mockturtle::node<Ntk>>>;

97-100: Remove const from primitive parameter delay_value.

Primitive types like uint64_t should be passed by value without const. The const qualifier is unnecessary for pass-by-value primitives.

🔧 Suggested change
-    hgraph_node(const mockturtle::node<Ntk>& first, const mockturtle::node<Ntk>& last, const uint64_t delay_value) :
+    hgraph_node(const mockturtle::node<Ntk>& first, const mockturtle::node<Ntk>& last, uint64_t delay_value) :

332-339: Consider runtime check instead of assert for fanin arity.

Asserts are compiled out in release builds. If children.size() doesn't match ntk.fanin_size(nd), create_node will be called with incorrect arity. A runtime exception provides safer behavior.

🔧 Suggested change
-                // Ensure child count matches function arity (including 0-fanin constants)
-                assert(children.size() == ntk.fanin_size(nd) &&
-                       "Mismatch between gathered children and node fanin count");
-
-                const auto new_sig = ntk_dest_v.create_node(children, ntk.node_function(nd));
+                // Ensure child count matches function arity (including 0-fanin constants)
+                if (children.size() != ntk.fanin_size(nd))
+                {
+                    throw std::runtime_error("Mismatch between gathered children and node fanin count");
+                }
+                const auto new_sig = ntk_dest_v.create_node(children, ntk.node_function(nd));

465-471: Rename shadowing variable to avoid confusion.

Line 465 declares a local variable n that shadows the function parameter n (line 450). This can lead to bugs and confusion.

🔧 Suggested change
-                              auto n = ntk.get_node(fi);
+                              const auto fi_node = ntk.get_node(fi);
 
                               auto it =
-                                  std::lower_bound(fis.begin(), fis.end(), n, [&](auto const& a, auto const& b)
+                                  std::lower_bound(fis.begin(), fis.end(), fi_node, [&](auto const& a, auto const& b)
                                                    { return ntk.rank_position(a) < ntk.rank_position(b); });
 
-                              fis.insert(it, n);
+                              fis.insert(it, fi_node);

725-728: Static PRNG is not thread-safe.

The static std::mt19937_64 generator is accessed without synchronization. If run() is called concurrently from multiple threads, this causes a data race. Consider documenting that this algorithm is not thread-safe, or use thread_local storage.

🔧 Suggested change (use thread_local)
-            // Generate a random engine
-            static std::mt19937_64 generator(std::random_device{}());
+            // Generate a random engine (thread_local for thread-safety)
+            thread_local std::mt19937_64 generator(std::random_device{}());
🧹 Nitpick comments (2)
include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp (2)

1-4: Migrate from "Created by" comment to Doxygen @file and @author tags.

Per coding guidelines, the project is migrating away from // Created by ... comments. Consider replacing with a Doxygen file header block.

🔧 Suggested change
-//
-// Created by benjamin on 11.06.24.
-//
+/**
+ * `@file` node_duplication_planarization.hpp
+ * `@brief` Implements node duplication planarization for crossing minimization.
+ * `@author` Benjamin Jiang
+ */

704-705: Add Doxygen documentation for run() method.

The run() method is missing Doxygen documentation. Per coding guidelines, all public methods should be documented.

🔧 Suggested change
+    /**
+     * `@brief` Executes the node duplication planarization algorithm.
+     *
+     * Processes the network from POs to PIs, computing optimal node orderings
+     * using the H-graph shortest path approach, and constructs a planar
+     * virtual_pi_network with duplicated nodes.
+     *
+     * `@return` A planarized virtual_pi_network containing the result.
+     */
     [[nodiscard]] virtual_pi_network<Ntk> run()

static_assert(mockturtle::has_foreach_pi_v<Ntk>, "Ntk does not implement the foreach_pi method");
static_assert(mockturtle::has_create_pi_v<virtual_pi_network<Ntk>>,
"virtual_pi_network<Ntk> does not implement create_pi");
static_assert(mockturtle::has_rank_position_v<Ntk> && "Ntk does not implement the rank_position function");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Fix malformed static_assert syntax.

The static_assert on line 129 uses && instead of a comma, which will not work correctly. The expression has_rank_position_v<Ntk> && "message" evaluates to a pointer (the string literal) which is always truthy, so this assertion will never fail even if the trait is false.

🐛 Proposed fix
-    static_assert(mockturtle::has_rank_position_v<Ntk> && "Ntk does not implement the rank_position function");
+    static_assert(mockturtle::has_rank_position_v<Ntk>, "Ntk does not implement the rank_position function");
🤖 Prompt for AI Agents
In
`@include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp`
at line 129, The static_assert using mockturtle::has_rank_position_v<Ntk> is
malformed (it uses && with the message string), so replace the logical-AND
pattern with the correct static_assert syntax that takes the trait as the first
argument and the message string as the second; update the static_assert
referencing mockturtle::has_rank_position_v<Ntk> and the message "Ntk does not
implement the rank_position function" accordingly.


// Check if the candidate matches the original fan-in or a duplicate.
// Also, verify if the candidate has already reached its fan-out limit.
// THis adjusts for virtual PIS
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix typo in comment.

Minor typo: "THis" should be "This".

🔧 Suggested change
-                // THis adjusts for virtual PIS
+                // This adjusts for virtual PIs
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// THis adjusts for virtual PIS
// This adjusts for virtual PIs
🤖 Prompt for AI Agents
In
`@include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp`
at line 215, Fix the typo in the inline comment that currently reads "// THis
adjusts for virtual PIS" by changing "THis" to "This" so it reads "// This
adjusts for virtual PIS"; locate this comment in
include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp
(the line containing the exact text "THis adjusts for virtual PIS") and update
it accordingly.

Comment on lines +844 to +846
static_assert(mockturtle::is_network_type_v<Ntk>, "NtkSrc is not a network type");
static_assert(mockturtle::has_create_node_v<Ntk>, "NtkSrc does not implement the create_node function");
static_assert(mockturtle::has_rank_position_v<Ntk>, "NtkSrc does not implement the rank_position function");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix inconsistent error message referencing NtkSrc.

The static_assert messages reference "NtkSrc" but the template parameter is named Ntk. This is a minor inconsistency.

🔧 Suggested change
-    static_assert(mockturtle::is_network_type_v<Ntk>, "NtkSrc is not a network type");
-    static_assert(mockturtle::has_create_node_v<Ntk>, "NtkSrc does not implement the create_node function");
-    static_assert(mockturtle::has_rank_position_v<Ntk>, "NtkSrc does not implement the rank_position function");
+    static_assert(mockturtle::is_network_type_v<Ntk>, "Ntk is not a network type");
+    static_assert(mockturtle::has_create_node_v<Ntk>, "Ntk does not implement the create_node function");
+    static_assert(mockturtle::has_rank_position_v<Ntk>, "Ntk does not implement the rank_position function");
🤖 Prompt for AI Agents
In
`@include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp`
around lines 844 - 846, The static_assert messages incorrectly reference
"NtkSrc" instead of the actual template parameter name `Ntk`; update the three
static_assert messages that mention mockturtle::is_network_type_v<Ntk>,
mockturtle::has_create_node_v<Ntk>, and mockturtle::has_rank_position_v<Ntk> to
refer to "Ntk" (e.g., "Ntk is not a network type", "Ntk does not implement the
create_node function", "Ntk does not implement the rank_position function") so
the error text matches the template parameter name used in
node_duplication_planarization.hpp.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR introduces a planarization framework for logic networks and a planar physical design flow for Field-Coupled Nanocomputing (FCN) circuits. It implements node duplication planarization based on the paper "Fabricatable Interconnect and Molecular QCA Circuits" and the Planar Layout from Network Embedding (PLANE) algorithm for generating crossing-free layouts.

Changes:

  • Node duplication planarization algorithm that solves the Node Duplication Crossing Minimization (NDCE) problem using H-graph shortest path finding
  • PLANE algorithm for generating planar 2DDWave-clocked Cartesian gate-level layouts from planar network embeddings
  • CLI command plane that performs the full physical design flow (fanout substitution, balancing, planarization, and layout generation)

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 13 comments.

Show a summary per file
File Description
include/fiction/algorithms/network_transformation/node_duplication_planarization.hpp Implements node duplication planarization using H-graph for crossing minimization
include/fiction/algorithms/physical_design/planar_layout_from_network_embedding.hpp Implements PLANE algorithm for planar layout generation from network embeddings
test/algorithms/network_transformation/node_duplication_planarization.cpp Comprehensive tests for planarization including equivalence checking and crossing verification
test/algorithms/physical_design/planar_layout_from_network_embedding.cpp Tests for PLANE algorithm including name conservation and exception handling
cli/cmd/physical_design/src/plane.cpp CLI command implementation for the PLANE flow
cli/cmd/physical_design/include/plane.hpp Header for the PLANE CLI command
cli/cmd/physical_design/cmd_physical_design.hpp Registration of the PLANE command
docs/changelog.rst Changelog entry documenting the new algorithms
bindings/mnt/pyfiction/include/pyfiction/pybind11_mkdoc_docstrings.hpp Auto-generated Python binding documentation

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Network type from which node types are drawn.)doc";

static const char *__doc_fiction_detail_hgraph_node_delay = R"doc(Specifies the delay value for the hgraph_node.)doc";

Copy link

Copilot AI Jan 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing documentation in generated docstrings: The "middle_fanins" member of hgraph_node is missing from the pybind11 docstrings. Since "outer_fanins", "delay", and "fanin_it" are documented (lines 8917-8919), "middle_fanins" should also be included.

Suggested change
static const char *__doc_fiction_detail_hgraph_node_middle_fanins = R"doc(Stores the fanins between the first and last positions of the ordering.
Their mutual order is irrelevant for the H-graph algorithm.)doc";

Copilot uses AI. Check for mistakes.
*/
std::vector<std::vector<hgraph_node<Ntk>>> lvl_pairs{};
/**
* The fanin nodes.
Copy link

Copilot AI Jan 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unclear member documentation: The "fis" member (line 810) is documented as "The fanin nodes." which is ambiguous. It should be more descriptive, such as "Temporary storage for fanin nodes during slice delay computation." or similar based on its usage in the code.

Suggested change
* The fanin nodes.
* Temporary storage for the fanin nodes of the currently processed node
* during the node duplication planarization procedure.

Copilot uses AI. Check for mistakes.
* Variant of the `mockturtle::initialize_copy_network`. This function helps with creating new networks from old
* networks. In the mockturtle/original version `old2new` is used to map nodes from the old network to nodes in the new
* network in a one-to-one relation. This variant allows old nodes to map to multiple nodes in order to represent
* relations to dulicated nodes.
Copy link

Copilot AI Jan 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo in comment: "dulicated" should be "duplicated"

Suggested change
* relations to dulicated nodes.
* relations to duplicated nodes.

Copilot uses AI. Check for mistakes.
0 :
propagate_left + cluster_new_lines[i] - two_input_new_lines[i - 1];

// ALso set the new lines for two input nodes
Copy link

Copilot AI Jan 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo in comment: "ALso" should be "Also"

Suggested change
// ALso set the new lines for two input nodes
// Also set the new lines for two input nodes

Copilot uses AI. Check for mistakes.
// Resolve new lines. Special case for the second fan-out of a fan-out node
if (ntk.is_fanout(pre) && (orientation[i] == 2 || orientation[i] == 3))
{
// n the special case the
Copy link

Copilot AI Jan 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Incomplete comment: "n the special case the" appears to be missing a word at the beginning. Should likely be "In the special case the"

Suggested change
// n the special case the
// In the special case the

Copilot uses AI. Check for mistakes.
{
std::sort(fc.fanin_nodes.begin(), fc.fanin_nodes.end(), [&ntk](int a, int b)
{ return ntk.rank_position(a) < ntk.rank_position(b); });
// compute the max_gap for two fan-ins of anode
Copy link

Copilot AI Jan 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo in documentation: "anode" should be "a node" in the comment. There's also a double space before "anode".

Suggested change
// compute the max_gap for two fan-ins of anode
// compute the max_gap for two fan-ins of a node

Copilot uses AI. Check for mistakes.
/**
* Checks if the given vector of nodes contains any non-primary inputs.
*
* @param v_next_level The vector of nodes to be checked.
Copy link

Copilot AI Jan 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing return documentation: The check_final_level function (line 692) has a description but is missing documentation for the return value. It should document that it returns true if all nodes in the vector are primary inputs, false otherwise.

Suggested change
* @param v_next_level The vector of nodes to be checked.
* @param v_next_level The vector of nodes to be checked.
* @return `true` if all nodes in `v_next_level` are primary inputs, `false` otherwise.

Copilot uses AI. Check for mistakes.

// Check if the candidate matches the original fan-in or a duplicate.
// Also, verify if the candidate has already reached its fan-out limit.
// THis adjusts for virtual PIS
Copy link

Copilot AI Jan 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo in comment: "THis" should be "This"

Suggested change
// THis adjusts for virtual PIS
// This adjusts for virtual PIS

Copilot uses AI. Check for mistakes.
Comment on lines +618 to +622
* This function computes the order of nodes in the next level based on their delay in the H-graph of the level. It
* selects the path with the least delay from the current level pairs and follows it via fanin relations. The nodes
* are inserted into the next level vector in the order they are encountered.
*
* @return The order of nodes in `next_level`
Copy link

Copilot AI Jan 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Incomplete function documentation: The compute_node_order function (line 624) has a brief description but is missing important details such as what it returns and how it uses the H-graph data structure. The return documentation only says "The order of nodes in next_level" but should be more specific about what this ordering represents.

Suggested change
* This function computes the order of nodes in the next level based on their delay in the H-graph of the level. It
* selects the path with the least delay from the current level pairs and follows it via fanin relations. The nodes
* are inserted into the next level vector in the order they are encountered.
*
* @return The order of nodes in `next_level`
* Computes a processing order for the nodes of the next network level from the level H-graph.
*
* The level H-graph is stored in the last entry of `lvl_pairs` as a collection of `hgraph_node<Ntk>` objects,
* each of which represents a possible path (or partial path) through the current level together with its
* accumulated delay. This function selects the H-graph node with the minimal delay and follows this path
* backwards via fanin relations in the underlying network, inserting the encountered nodes into
* `next_level` using `insert_if_not_first` to respect fanout saturation constraints.
*
* The resulting vector therefore encodes the sequence in which nodes in the *next* level should be considered
* by the node duplication planarization algorithm: it is an ordered list of `mockturtle::node<Ntk>` objects
* along the chosen minimum-delay path in the H-graph, with earlier elements expected to be processed (or
* placed) before later ones.
*
* @return A vector containing the nodes of the next level in the order implied by the minimum-delay H-graph path.

Copilot uses AI. Check for mistakes.
struct hgraph_node
{
/**
* First and last fanin.
Copy link

Copilot AI Jan 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Missing documentation for member variable: The "outer_fanins" member of the hgraph_node struct (line 77) is documented with just "First and last fanin." which should be more descriptive, such as "Pair containing the first and last fanins in the ordering."

Suggested change
* First and last fanin.
* Pair containing the first (leftmost) and last (rightmost) fanins in the ordering.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants