% http://www.cs.kuleuven.be/~dtai/events/ASP-competition/Benchmarks/ChannelRouting.shtml % From B-Prolog's example suite. solve(As):- extract_inputs(As,L,T,Nets), post_domain_constrs(Nets,L,T), not_overlap(Nets), extract_level_vars(Nets,Levels), labeling(Levels),!, sort(Nets,OrderedNets), extract_global_tracks(OrderedNets,Vars), labeling([ff],Vars),!, output(Nets). solve(_):- format("UNSATISFIABLE~n"). extract_inputs([],_L,_T,Nets):-closetail(Nets). extract_inputs([layers(L)|As],L1,T,Nets):-!,L1=L, extract_inputs(As,L,T,Nets). extract_inputs([tracks(T)|As],L,T1,Nets):-!,T1=T, extract_inputs(As,L,T,Nets). extract_inputs([connect(Id,TB,TermNo)|As],L,T,Nets):- Term=term(TB,TermNo), Net=net(_Level,Id,_Layer,_Track,_GlobTrack,Terms), member(Net,Nets), member(Term,Terms),!, extract_inputs(As,L,T,Nets). post_domain_constrs([],_L,_T). post_domain_constrs([net(_Level,_Id,Layer,Track,GlobalTrack,Terms)|Nets],L,T):- Layer :: 1..L, Track :: 1..T, Max is L*T-1, GlobalTrack :: 0..Max, Layer #= GlobalTrack // T +1, Track #= GlobalTrack mod T + 1, closetail(Terms), post_domain_constrs(Nets,L,T). not_overlap([_]):-!. not_overlap([Net|Nets]):- Net=net(Level,_Id,_Layer,_Track,_GlobTrack,Terms), Level #>0, (member(term(top,_),Terms)->true;Level #> 100), % assign a large level to it if it connects to only bottom terminals not_overlap(Net,Nets), not_overlap(Nets). not_overlap(_,[]). not_overlap(Net1,[Net2|Nets]):- not_overlap_horizontally(Net1,Net2), not_overlap_vertically(Net1,Net2), not_overlap(Net1,Nets). not_overlap_horizontally(net(_,_,Layer1,Track1,GlobTrack1,Terms1),net(_,_,Layer2,Track2,GlobTrack2,Terms2)):- terminals_intersect(Terms1,Terms2),!, Layer1#=Layer2 #=> Track1#\=Track2, GlobTrack1 #\= GlobTrack2. not_overlap_horizontally(_,_). not_overlap_vertically(net(Level1,_,Layer1,Track1,GlobTrack1,Terms1),net(Level2,_,Layer2,Track2,GlobTrack2,Terms2)):- terminals_above(Terms1,Terms2),!, Level1 #< Level2, % used as heuristics in labeling Layer1#=Layer2 #=> Track1# GlobTrack1 # Track2# GlobTrack2 #=S1,T==S2,T=