Index: trunk/src/libcschem/abstract.c =================================================================== --- trunk/src/libcschem/abstract.c (revision 7614) +++ trunk/src/libcschem/abstract.c (revision 7615) @@ -138,14 +138,13 @@ switch(type) { case CSCH_ATYPE_INVALID: - case CSCH_ATYPE_NET: case CSCH_ATYPE_BUSNET: case CSCH_ATYPE_BUSCHAN: - case CSCH_ATYPE_PORT: case CSCH_ATYPE_BUSPORT: case CSCH_ATYPE_HUB: break; - + case CSCH_ATYPE_PORT: abs->new_ports = 1; break; + case CSCH_ATYPE_NET: abs->new_nets = 1; break; case CSCH_ATYPE_COMP: abs->new_comps = 1; break; } } Index: trunk/src/libcschem/abstract.h =================================================================== --- trunk/src/libcschem/abstract.h (revision 7614) +++ trunk/src/libcschem/abstract.h (revision 7615) @@ -51,6 +51,8 @@ /* compilation state */ unsigned new_comps:1; /* set to 1 whe a new component is created */ + unsigned new_nets:1; /* set to 1 whe a new net is created */ + unsigned new_ports:1; /* set to 1 whe a new port is created */ }; typedef enum csch_atype_e { Index: trunk/src/libcschem/compile.c =================================================================== --- trunk/src/libcschem/compile.c (revision 7614) +++ trunk/src/libcschem/compile.c (revision 7615) @@ -481,6 +481,18 @@ } /* Returns whether the loop should be restarted because of new components added */ +RND_INLINE int csch_compile_post_port(csch_project_t *proj, int viewid, csch_abstract_t *dst, csch_aport_t *port) +{ + if (port->hdr.compiled) return 0; + port->hdr.compiled = 1; + + csch_eng_call(proj, viewid, CSCH_ENGHK_COMPILE_PORT, FGW_AOBJ, port, FGW_INVALID); + + return dst->new_ports; +} + + +/* Returns whether the loop should be restarted because of new components added */ RND_INLINE int csch_compile_post_comp(csch_project_t *proj, int viewid, csch_abstract_t *dst, csch_acomp_t *comp) { htsp_entry_t *p; @@ -490,13 +502,27 @@ csch_eng_call(proj, viewid, CSCH_ENGHK_COMPILE_COMPONENT1, FGW_AOBJ, comp, FGW_INVALID); + restart_port:; + dst->new_ports = 0; for(p = htsp_first(&comp->ports); p != NULL; p = htsp_next(&comp->ports, p)) - csch_eng_call(proj, viewid, CSCH_ENGHK_COMPILE_PORT, FGW_AOBJ, p->value, FGW_INVALID); + if (csch_compile_post_port(proj, viewid, dst, p->value)) + goto restart_port; /* if new components are created restart the loop because genht gets confused */ csch_eng_call(proj, viewid, CSCH_ENGHK_COMPILE_COMPONENT2, FGW_AOBJ, comp, FGW_INVALID); return dst->new_comps; } +/* Returns whether the loop should be restarted because of new components added */ +RND_INLINE int csch_compile_post_net(csch_project_t *proj, int viewid, csch_abstract_t *dst, csch_anet_t *net) +{ + if (net->hdr.compiled) return 0; + net->hdr.compiled = 1; + + csch_eng_call(proj, viewid, CSCH_ENGHK_COMPILE_NET, FGW_AOBJ, net, FGW_INVALID); + + return dst->new_nets; +} + int csch_compile_post(csch_project_t *proj, int viewid, csch_abstract_t *dst) { htsp_entry_t *e; @@ -508,8 +534,11 @@ if (csch_compile_post_comp(proj, viewid, dst, e->value)) goto restart_comp; /* if new components are created restart the loop because genht gets confused */ + restart_net:; + dst->new_nets = 0; for(e = htsp_first(&dst->nets); e != NULL; e = htsp_next(&dst->nets, e)) - csch_eng_call(proj, viewid, CSCH_ENGHK_COMPILE_NET, FGW_AOBJ, e->value, FGW_INVALID); + if (csch_compile_post_net(proj, viewid, dst, e->value)) + goto restart_net; /* if new components are created restart the loop because genht gets confused */ csch_text_invalidate_all_project(proj, 1);