question: public ArtResult fanout ( BrdAbitPin p_pin , interactive . IteraSettings p_settings , int p_ripup_costs , ThreadStoppable p_stoppable ) { if ( p_pin . first_layer ( ) != p_pin . last_layer ( ) || p_pin . net_count ( ) != 1 ) { return ArtResult . ALREADY_CONNECTED ; } int pin_net_no = p_pin . get_net_no ( 0 ) ; int pin_layer = p_pin . first_layer ( ) ; Set < BrdItem > pin_connected_set = p_pin . get_connected_set ( pin_net_no ) ; for ( BrdItem curr_item : pin_connected_set ) { if ( curr_item . first_layer ( ) != pin_layer || curr_item . last_layer ( ) != pin_layer ) { return ArtResult . ALREADY_CONNECTED ; } } Set < BrdItem > unconnected_set = p_pin . get_unconnected_set ( pin_net_no ) ; if ( unconnected_set . isEmpty ( ) ) { return ArtResult . ALREADY_CONNECTED ; } ArtControl ctrl_settings = new ArtControl ( this , pin_net_no , p_settings ) ; ctrl_settings . is_fanout = true ; ctrl_settings . stop_remove_fanout_vias = false ; if ( p_ripup_costs >= 0 ) { ctrl_settings . ripup_allowed = true ; ctrl_settings . ripup_costs = p_ripup_costs ; } SortedSet < BrdItem > ripped_item_list = new TreeSet < BrdItem > ( ) ; ArtEngine a_engine = new ArtEngine ( this , pin_net_no , ctrl_settings . trace_clearance_idx , p_stoppable ) ; ArtResult result = a_engine . autoroute_connection ( pin_connected_set , unconnected_set , ctrl_settings , ripped_item_list ) ; if ( result == ArtResult . ROUTED ) { TimeLimitStoppable t_limit = new TimeLimitStoppable ( s_PREVENT_ENDLESS_LOOP , p_stoppable ) ; changed_area_optimize ( NetNosList . EMPTY , p_settings . trace_pullt_min_move , ctrl_settings . trace_costs , t_limit ) ; } return result ; }
target:  Autoroute from the input pin until the first via, in case the pin and its connected set has only 1 layer.  Ripup is allowed if p_ripup_costs is >= 0.  Returns an enum of type AutorouteResult