seveibar/am3352-dev-board
A 324-ball TI AM3352 ARM processor with DDR3, LCD, USB, Ethernet, storage, serial, analog, clock, reset, power, and JTAG interfaces, paired with configurable JST-GH board connectors and constrained PCB routing.
- Version
- 1.0.2
- License
- unset
- Stars
- 0
scripts/RouteStable.java
import app.freerouting.core.*;
import app.freerouting.interactive.*;
import app.freerouting.board.*;
import app.freerouting.settings.RouterSettings;
import app.freerouting.autoroute.*;
import java.io.*;import java.nio.file.*;import java.time.*;import java.util.*;
public class RouteStable {
static HeadlessBoardManager manager;static String output;static long lastSave=0;
static void save(RoutingBoard b){try{
manager.update_routing_board(b);try(var out=Files.newOutputStream(Path.of(output+".ses.tmp"))){manager.saveAsSpecctraSessionSes(out,"am3352");}
Files.move(Path.of(output+".ses.tmp"),Path.of(output+".ses"),StandardCopyOption.REPLACE_EXISTING);
try(var o=new ObjectOutputStream(Files.newOutputStream(Path.of(output+".frb")))){o.writeObject(b);}
int missing=0;for(int n=1;n<=b.rules.nets.max_net_no();n++)missing+=Math.max(0,b.get_connected_sets(n).size()-1);
Files.writeString(Path.of(output+".json"),"{\"incompleteCount\":"+missing+"}");System.out.println("CHECKPOINT incomplete="+missing);lastSave=System.currentTimeMillis();
}catch(Exception e){throw new RuntimeException(e);}}
public static void main(String[] args)throws Exception {
output=args[1];RoutingJob job=new RoutingJob();manager=new HeadlessBoardManager(Locale.ENGLISH,job);
if(args[0].endsWith(".frb")){try(var in=new ObjectInputStream(Files.newInputStream(Path.of(args[0])))){manager.update_routing_board((RoutingBoard)in.readObject());}}
else System.out.println(manager.loadFromSpecctraDsn(new FileInputStream(args[0]),null,new ItemIdentificationNumberGenerator()));
job.board=manager.get_routing_board();job.startedAt=Instant.now();job.routerSettings=new RouterSettings(job.board);job.routerSettings.setRunFanout(false);job.routerSettings.setRunOptimizer(false);job.routerSettings.maxPasses=Integer.parseInt(args[2]);job.routerSettings.maxThreads=1;if(args.length>3)job.routerSettings.ignoreNetClasses=args[3].split(",");
if(args.length>3)for(int n=1;n<=job.board.rules.nets.max_net_no();n++){var nc=job.board.rules.nets.get(n).get_class();nc.is_ignored_by_autorouter=java.util.Arrays.asList(args[3].split(",")).contains(nc.get_name());}
if(args.length>4 && args[4].equals("virtual-planes"))job.board.rules.set_ignore_conduction(true);
job.thread=new StoppableThread(){protected void thread_action(){}};
Thread watcher=new Thread(()->{while(true){try{Thread.sleep(1000);if(Files.exists(Path.of(output+".stop"))){job.thread.requestStop();return;}}catch(Exception e){return;}}});watcher.setDaemon(true);watcher.start();
BatchAutorouter router=new BatchAutorouter(job);var field=NamedAlgorithm.class.getDeclaredField("board");field.setAccessible(true);
router.addBoardUpdatedEventListener(e->{if(System.currentTimeMillis()-lastSave>30000)try{save((RoutingBoard)field.get(router));}catch(Exception x){throw new RuntimeException(x);}});
router.addTaskStateChangedEventListener(e->System.out.println("TASK "+e.getTaskState()+" pass="+e.getPassNumber()));
save(job.board);router.runBatchLoop();save((RoutingBoard)field.get(router));System.out.println("FINISHED");
}
}