@@ -344,9 +344,32 @@ static std::pair<bool, BitSelection> matches(std::string name, const std::string
344344 }
345345}
346346
347- static int graph_node (TclCall call) {
348- // TODO is that it?
349- return redirect_unknown (call);
347+ static int getter_graph_node (TclCall call) {
348+ // Insert -getter-validated as first argument for passing to unknown
349+ // to distinguish resolved and unknown getters.
350+ // For example, if call is ["get_foo", "-bar"]
351+ // then newCall is ["get_foo", "-getter-validated", "-bar"]
352+ Tcl_Obj* validity_tag = Tcl_NewStringObj (" -getter-validated" , -1 );
353+ Tcl_IncrRefCount (validity_tag);
354+ std::vector<Tcl_Obj*> newObjv (call.objc + 1 );
355+ log_assert (call.objc > 0 );
356+ newObjv[0 ] = call.objv [0 ];
357+ newObjv[1 ] = validity_tag;
358+ for (int i = 1 ; i < call.objc ; ++i) {
359+ newObjv[i + 1 ] = call.objv [i];
360+ }
361+ // Send the vector to the Tcl land
362+ Tcl_Obj** allocatedObjv = new Tcl_Obj*[call.objc + 1 ];
363+ for (int i = 0 ; i < call.objc + 1 ; ++i) {
364+ allocatedObjv[i] = newObjv[i];
365+ }
366+ TclCall newCall {
367+ .interp = call.interp ,
368+ .objc = call.objc + 1 ,
369+ .objv = allocatedObjv
370+ };
371+ // Finally, redirect to unknown handler
372+ return redirect_unknown (newCall);
350373}
351374
352375static int redirect_unknown (TclCall call) {
@@ -610,7 +633,7 @@ static int sdc_get_pins_cmd(ClientData data, Tcl_Interp *interp, int objc, Tcl_O
610633 const auto & pins = objects->design_pins ;
611634 resolved = find_matching<SdcObjects::CellPin, decltype (pins)>(pins, config, opts.patterns , " pin" );
612635
613- return graph_node (TclCall{interp, objc, objv});
636+ return getter_graph_node (TclCall{interp, objc, objv});
614637}
615638
616639static int sdc_get_ports_cmd (ClientData data, Tcl_Interp *interp, int objc, Tcl_Obj* const objv[])
@@ -631,7 +654,7 @@ static int sdc_get_ports_cmd(ClientData data, Tcl_Interp *interp, int objc, Tcl_
631654 merge_or_init (std::make_pair (name, wire), objects->constrained_ports , matching_bits);
632655 }
633656
634- return graph_node (TclCall{interp, objc, objv});
657+ return getter_graph_node (TclCall{interp, objc, objv});
635658}
636659
637660static int sdc_get_nets_cmd (ClientData data, Tcl_Interp *interp, int objc, Tcl_Obj* const objv[])
@@ -652,7 +675,7 @@ static int sdc_get_nets_cmd(ClientData data, Tcl_Interp *interp, int objc, Tcl_O
652675 merge_or_init (std::make_pair (name, wire), objects->constrained_nets , matching_bits);
653676 }
654677
655- return graph_node (TclCall{interp, objc, objv});
678+ return getter_graph_node (TclCall{interp, objc, objv});
656679}
657680
658681class SDCInterpreter
0 commit comments