Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/Design.cc
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "ord/OpenRoad.hh"
#include "ord/Tech.h"
#include "tcl.h"
#include "tclDecls.h"
#include "utl/Logger.h"

namespace ord {
Expand Down Expand Up @@ -136,6 +137,7 @@ std::string Design::evalTclString(const std::string& cmd)
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 ?

Tcl_SetAssocData(tcl_interp, "design", nullptr, this);
Tcl_Eval(tcl_interp, cmd.c_str());
return std::string(Tcl_GetStringResult(tcl_interp));
}
Expand Down