Skip to content

Conversation

@fgaray
Copy link
Contributor

@fgaray fgaray commented Dec 31, 2025

This is a fix for a crash that happens when calling initialize_floorplan from python. In a normal OpenROAD run, we associate the design with Tcl_SetAssocData in src/Main.cc but this function is not called if OpenROAD is being used as a library.

This is a fix for a crash that happens when calling
initialize_floorplan from python. In a normal OpenROAD run, we associate
the design with Tcl_SetAssocData in src/Main.cc but this function is not
called if OpenROAD is being used as a library.

Signed-off-by: Felipe Garay <[email protected]>
Copy link
Contributor

@github-actions github-actions bot left a comment

Choose a reason for hiding this comment

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

clang-tidy made some suggestions

@github-actions
Copy link
Contributor

clang-tidy review says "All clean, LGTM! 👍"

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request fixes a crash when calling Tcl commands from Python by associating the current design with the Tcl interpreter. The change is correct and addresses the issue. I have one review comment with two suggestions for improvement: moving the association logic to the constructor for efficiency, and replacing the magic string "design" with a constant for better maintainability.

auto openroad = getOpenRoad();
ord::OpenRoad::setOpenRoad(openroad, /* reinit_ok */ true);
Tcl_Interp* tcl_interp = openroad->tclInterp();
sta::Sta::setSta(openroad->getSta());
Copy link
Contributor

Choose a reason for hiding this comment

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

medium

While this correctly fixes the crash, I have a couple of suggestions for improvement on this line:

  • Efficiency: evalTclString will now call Tcl_SetAssocData on every invocation. For improved efficiency, this association should be made only once in the Design constructor. This would involve removing this line and adding Tcl_SetAssocData(getOpenRoad()->tclInterp(), "design", nullptr, this); inside the Design::Design constructor.

  • Magic String: The string literal "design" is a magic string. It would be best to define it as a constant in a shared header file and use the constant here and wherever Tcl_GetAssocData is called with this key. This improves maintainability and prevents errors from typos.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I am ok with applying the efficiency suggestion but I don't think it is needed

Copy link
Member

Choose a reason for hiding this comment

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

Is there any downside to changing it? If not it seems reasonable to do so (just to clarify that it is a one time binding).

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yeah, I think I will apply it. I will be back in a moment.

Copy link
Collaborator

Choose a reason for hiding this comment

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

I would not do this. It makes it so the last design created is the only one you can evaltcl on. That's a bad experience

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Well, that explains the regressions that I was seeing on the tests.

Seems like we will need to call Tcl_SetAssocData every time we want to eval a tcl command. The performance impact is not clear to me but I bet it will be negligible compared to the execution of the command.

Wdyt @maliberty ?

@fgaray fgaray marked this pull request as ready for review December 31, 2025 02:31
@maliberty maliberty merged commit 129eb14 into The-OpenROAD-Project:master Jan 1, 2026
13 checks passed
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.

3 participants