2222USING_YOSYS_NAMESPACE
2323PRIVATE_NAMESPACE_BEGIN
2424
25- int  autoname_worker (Module *module , const  dict<Wire*, int >& wire_score)
25+ typedef  struct  name_proposal  {
26+ 	string name;
27+ 	unsigned  int  score;
28+ 	name_proposal () : name(" "  ), score(-1 ) { }
29+ 	name_proposal (string name, unsigned  int  score) : name(name), score(score) { }
30+ 	bool  operator <(const  name_proposal &other) const  {
31+ 		if  (score != other.score )
32+ 			return  score < other.score ;
33+ 		else 
34+ 			return  name.length () < other.name .length ();
35+ 	}
36+ } name_proposal;
37+ 
38+ int  autoname_worker (Module *module , const  dict<Wire*, unsigned  int >& wire_score)
2639{
27- 	dict<Cell*, pair< int , string> > proposed_cell_names;
28- 	dict<Wire*, pair< int , string> > proposed_wire_names;
29- 	int  best_score = - 1 ;
40+ 	dict<Cell*, name_proposal > proposed_cell_names;
41+ 	dict<Wire*, name_proposal > proposed_wire_names;
42+ 	name_proposal best_name ;
3043
3144	for  (auto  cell : module ->selected_cells ()) {
3245		if  (cell->name [0 ] == ' $'  ) {
@@ -36,14 +49,14 @@ int autoname_worker(Module *module, const dict<Wire*, int>& wire_score)
3649					if  (bit.wire  != nullptr  && bit.wire ->name [0 ] != ' $'  ) {
3750						if  (suffix.empty ())
3851							suffix = stringf (" _%s_%s"  , log_id (cell->type ), log_id (conn.first ));
39- 						string  new_name (bit. wire -> name . str () + suffix); 
40- 						int  score = wire_score. at ( bit.wire ); 
41- 						if  ( cell->output (conn.first )) score =  0 ; 
42- 						score =  10000 *score + new_name. size ( );
43- 						if  (!proposed_cell_names.count (cell) || score  < proposed_cell_names.at (cell). first ) {
44- 							if  (best_score  < 0  || score < best_score )
45- 								best_score  = score ;
46- 							proposed_cell_names[cell] = make_pair (score, new_name) ;
52+ 						name_proposal  proposed_name ( 
53+ 							 bit.wire -> name . str () + suffix, 
54+ 							 cell->output (conn.first ) ?  0  : wire_score. at (bit. wire ) 
55+ 						);
56+ 						if  (!proposed_cell_names.count (cell) || proposed_name  < proposed_cell_names.at (cell)) {
57+ 							if  (proposed_name  < best_name )
58+ 								best_name  = proposed_name ;
59+ 							proposed_cell_names[cell] = proposed_name ;
4760						}
4861					}
4962			}
@@ -54,32 +67,36 @@ int autoname_worker(Module *module, const dict<Wire*, int>& wire_score)
5467					if  (bit.wire  != nullptr  && bit.wire ->name [0 ] == ' $'   && !bit.wire ->port_id ) {
5568						if  (suffix.empty ())
5669							suffix = stringf (" _%s"  , log_id (conn.first ));
57- 						string  new_name (cell-> name . str () + suffix); 
58- 						int  score = wire_score. at (bit. wire ); 
59- 						if  ( cell->output (conn.first )) score =  0 ; 
60- 						score =  10000 *score + new_name. size ( );
61- 						if  (!proposed_wire_names.count (bit.wire ) || score  < proposed_wire_names.at (bit.wire ). first ) {
62- 							if  (best_score  < 0  || score < best_score )
63- 								best_score  = score ;
64- 							proposed_wire_names[bit.wire ] = make_pair (score, new_name) ;
70+ 						name_proposal  proposed_name ( 
71+ 							cell-> name . str () + suffix, 
72+ 							 cell->output (conn.first ) ?  0  : wire_score. at (bit. wire ) 
73+ 						);
74+ 						if  (!proposed_wire_names.count (bit.wire ) || proposed_name  < proposed_wire_names.at (bit.wire )) {
75+ 							if  (proposed_name  < best_name )
76+ 								best_name  = proposed_name ;
77+ 							proposed_wire_names[bit.wire ] = proposed_name ;
6578						}
6679					}
6780			}
6881		}
6982	}
7083
84+ 	//  compare against double best score for following comparisons so we don't
85+ 	//  pre-empt a future iteration
86+ 	best_name.score  *= 2 ;
87+ 
7188	for  (auto  &it : proposed_cell_names) {
72- 		if  (best_score* 2  < it.second . first )
89+ 		if  (best_name  < it.second )
7390			continue ;
74- 		IdString n = module ->uniquify (IdString (it.second .second ));
91+ 		IdString n = module ->uniquify (IdString (it.second .name ));
7592		log_debug (" Rename cell %s in %s to %s.\n "  , log_id (it.first ), log_id (module ), log_id (n));
7693		module ->rename (it.first , n);
7794	}
7895
7996	for  (auto  &it : proposed_wire_names) {
80- 		if  (best_score* 2  < it.second . first )
97+ 		if  (best_name  < it.second )
8198			continue ;
82- 		IdString n = module ->uniquify (IdString (it.second .second ));
99+ 		IdString n = module ->uniquify (IdString (it.second .name ));
83100		log_debug (" Rename wire %s in %s to %s.\n "  , log_id (it.first ), log_id (module ), log_id (n));
84101		module ->rename (it.first , n);
85102	}
@@ -115,7 +132,7 @@ struct AutonamePass : public Pass {
115132
116133		for  (auto  module  : design->selected_modules ())
117134		{
118- 			dict<Wire*, int > wire_score;
135+ 			dict<Wire*, unsigned   int > wire_score;
119136			for  (auto  cell : module ->selected_cells ())
120137			for  (auto  &conn : cell->connections ())
121138			for  (auto  bit : conn.second )
0 commit comments