From 05437b1d489be4773d3f5d0140eb85ed6614dfeb Mon Sep 17 00:00:00 2001 From: h_vogt Date: Fri, 3 Aug 2012 22:42:33 +0200 Subject: [PATCH] inpcom.c: safely uncomment unused subcircuits (top level only) if they contain further nested subcircuits --- src/frontend/inpcom.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/frontend/inpcom.c b/src/frontend/inpcom.c index 7277c7882..5b25a5753 100644 --- a/src/frontend/inpcom.c +++ b/src/frontend/inpcom.c @@ -1470,8 +1470,8 @@ comment_out_unused_subckt_models( struct line *start_card , int no_of_lines) struct line *card; char **used_subckt_names, **used_model_names, *line = NULL, *subckt_name, *model_name; int num_used_subckt_names = 0, num_used_model_names = 0, i = 0, num_terminals = 0, tmp_cnt = 0; - bool processing_subckt = FALSE, found_subckt = FALSE, remove_subckt = FALSE, found_model = FALSE, has_models = FALSE; - int skip_control = 0; + bool processing_subckt = FALSE, found_subckt = FALSE, remove_subckt = FALSE, found_model = FALSE, has_models = FALSE; + int skip_control = 0, nested_subckt = 0; /* generate arrays of *char for subckt or model names. Start with 1000, but increase, if number of lines in deck is larger */ @@ -1558,22 +1558,29 @@ comment_out_unused_subckt_models( struct line *start_card , int no_of_lines) get_subckts_for_subckt( start_card, used_subckt_names[i], used_subckt_names, &num_used_subckt_names, used_model_names, &num_used_model_names, has_models ); - /* comment out any unused subckts */ + /* comment out any unused subckts, currently only at top level */ for ( card = start_card; card != NULL; card = card->li_next ) { line = card->li_line; if ( *line == '*' ) continue; if ( ciprefix( ".subckt", line ) || ciprefix( ".macro", line ) ) { + nested_subckt++; subckt_name = get_subckt_model_name( line ); - remove_subckt = TRUE; - for ( i = 0; i < num_used_subckt_names; i++ ) - if ( strcmp( used_subckt_names[i], subckt_name ) == 0 ) remove_subckt = FALSE; + if ( nested_subckt == 1 ) { + /* check if unused, only at top level */ + remove_subckt = TRUE; + for ( i = 0; i < num_used_subckt_names; i++ ) + if ( strcmp( used_subckt_names[i], subckt_name ) == 0 ) remove_subckt = FALSE; + } tfree(subckt_name); } if ( ciprefix( ".ends", line ) || ciprefix( ".eom", line ) ) { - if ( remove_subckt ) *line = '*'; - remove_subckt = FALSE; + nested_subckt--; + if ( remove_subckt ) + *line = '*'; + if ( nested_subckt == 0 ) + remove_subckt = FALSE; } if ( remove_subckt ) *line = '*'; else if ( has_models && (ciprefix( ".model", line ) || ciprefix( ".cmodel", line )) ) {