@@ -157,14 +157,15 @@ pub fn solve(nodes :&[Node], edges :&[Edge], symbols:&[(EdgeRef,&Symbol)], edges
157157 //
158158 // symbol node x deltas
159159 for ( i, dx) in node_delta_xs. iter ( ) . enumerate ( ) {
160- let dx0a = s. cond_constraint ( symbol_node_xs[ i] , symbol_node_xs[ i+1 ] , 0 ) ;
160+ //let dx0a = s.cond_constraint(symbol_node_xs[i], symbol_node_xs[i+1], 0);
161+ //s.sat.add_clause(vec![!dx.lt_const(0),dx0a]);
162+
161163 let dx0b = s. cond_constraint ( symbol_node_xs[ i+1 ] , symbol_node_xs[ i] , 0 ) ;
162164 let dx1a = s. cond_constraint ( symbol_node_xs[ i] , symbol_node_xs[ i+1 ] , -1 * symbol_factor) ;
163165 let dx1b = s. cond_constraint ( symbol_node_xs[ i+1 ] , symbol_node_xs[ i] , 1 * symbol_factor) ;
164- s. sat . add_clause ( vec ! [ !dx. lt_const( 0 ) , dx0a] ) ;
165- s. sat . add_clause ( vec ! [ !dx. lt_const( 0 ) , dx0b] ) ;
166- s. sat . add_clause ( vec ! [ dx. lt_const( 0 ) , !dx. lt_const( 1 ) , dx1a] ) ;
167- s. sat . add_clause ( vec ! [ dx. lt_const( 0 ) , !dx. lt_const( 1 ) , dx1b] ) ;
166+ s. sat . add_clause ( vec ! [ !dx. lte_const( 0 ) , dx0b] ) ;
167+ s. sat . add_clause ( vec ! [ dx. lte_const( 0 ) , !dx. lte_const( 1 ) , dx1a] ) ;
168+ s. sat . add_clause ( vec ! [ dx. lte_const( 0 ) , !dx. lte_const( 1 ) , dx1b] ) ;
168169 }
169170
170171 // (c1) global order
@@ -222,15 +223,32 @@ pub fn solve(nodes :&[Node], edges :&[Edge], symbols:&[(EdgeRef,&Symbol)], edges
222223 // After optimization, we extract the node_dx, ndoe_y, edge_y values
223224 // and use them add constraints to symbol_node_xs.
224225
225- let ( node_dx_values, node_y_values, edge_y_values) = {
226+ let ( node_dx_values, node_y_values, edge_y_values, edge_short_values ) = {
226227 let m = s. solve ( ) . unwrap ( ) ;
227228 let node_dx_values = node_delta_xs. iter ( )
228229 . map ( |x| m. sat . value ( x) ) . collect :: < Vec < _ > > ( ) ;
229230 let node_y_values = node_ys. iter ( )
230231 . map ( |x| m. diff . get_value ( * x) ) . collect :: < Vec < _ > > ( ) ;
231232 let edge_y_values = edge_ys. iter ( )
232233 . map ( |x| m. diff . get_value ( * x) ) . collect :: < Vec < _ > > ( ) ;
233- ( node_dx_values, node_y_values, edge_y_values)
234+ let edge_shapes = edge_shapes. iter ( ) . map ( |( b, e) | {
235+ let begin = if m. sat . value ( & b. straight ) { EdgeDir :: Straight }
236+ else if m. sat . value ( & b. up ) { EdgeDir :: Up }
237+ else if m. sat . value ( & b. down ) { EdgeDir :: Down }
238+ else { panic ! ( ) } ;
239+ let end = if m. sat . value ( & e. straight ) { EdgeDir :: Straight }
240+ else if m. sat . value ( & e. up ) { EdgeDir :: Up }
241+ else if m. sat . value ( & e. down ) { EdgeDir :: Down }
242+ else { panic ! ( ) } ;
243+ ( begin, end)
244+ } ) . collect :: < Vec < _ > > ( ) ;
245+ let edge_short_values = edge_short. iter ( ) . map ( |x| m. sat . value ( & x. 0 ) || m. sat . value ( & x. 1 ) ) . collect :: < Vec < _ > > ( ) ;
246+ debug ! ( "Node dx {:?}" , node_dx_values) ;
247+ debug ! ( "Edge shapes {:?}" , edge_shapes) ;
248+ let sxs = symbol_node_xs. iter ( ) . map ( |v| m. diff . get_value ( * v) ) . collect :: < Vec < _ > > ( ) ;
249+ debug ! ( "Symbol Node Xs {:?}" , sxs) ;
250+
251+ ( node_dx_values, node_y_values, edge_y_values, edge_short_values)
234252 } ;
235253
236254 // Minimum DX values.
@@ -246,7 +264,8 @@ pub fn solve(nodes :&[Node], edges :&[Edge], symbols:&[(EdgeRef,&Symbol)], edges
246264 let dy1 = node_y_values[ e. a . node ] - edge_y_values[ i] ;
247265 let dy2 = edge_y_values[ i] - node_y_values[ e. b . node ] ;
248266 let samedir = dy1. signum ( ) == dy2. signum ( ) && dy1. signum ( ) != 0 ;
249- let dist = dy1. abs ( ) + dy2. abs ( ) + if samedir { 0 } else { 1 } ;
267+ let short = edge_short_values[ i] ;
268+ let dist = dy1. abs ( ) + dy2. abs ( ) + if samedir || short { 0 } else { 1 } ;
250269 debug ! ( "Edge {:?} dist{} dy{} dy{} {:?} {:?} {}" , e, dist, dy1, dy2, x1, x2, -( dist* symbol_factor) ) ;
251270
252271 let c = s. cond_constraint ( x1, x2, -( dist* symbol_factor) ) ;
@@ -375,7 +394,7 @@ fn optimize_and_commit_unary(name :&str, s :&mut SATModDiff, x :Unary) -> Result
375394 Ok ( ( ) )
376395}
377396
378- #[ derive( PartialEq , Eq ) ]
397+ #[ derive( PartialEq , Eq , Debug ) ]
379398enum EdgeDir { Up , Straight , Down }
380399
381400fn map_portshape ( s : & minisat:: Model , x : & PortShape ) -> EdgeDir {
0 commit comments