Index: trunk/src/libcschem/abstract.c =================================================================== --- trunk/src/libcschem/abstract.c (revision 7613) +++ trunk/src/libcschem/abstract.c (revision 7614) @@ -135,6 +135,19 @@ if (abs->next_aid < 1) abs->next_aid = 1; htip_set(&abs->aid2obj, dst->aid, dst); + + 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_COMP: abs->new_comps = 1; break; + } } csch_anet_t *csch_anet_get(csch_abstract_t *abs, const char *netname, int alloc, int set_no_uname) Index: trunk/src/libcschem/abstract.h =================================================================== --- trunk/src/libcschem/abstract.h (revision 7613) +++ trunk/src/libcschem/abstract.h (revision 7614) @@ -48,6 +48,9 @@ long wirenet, comp, port; long target_tmp; /* next id for temporary object created by the target plugin(s) - post-increment */ } ucnt; + + /* compilation state */ + unsigned new_comps:1; /* set to 1 whe a new component is created */ }; typedef enum csch_atype_e { @@ -70,6 +73,7 @@ vtp0_t srcs; /* list of pointers to concrete objects that were source to this abstract object */ csch_abstract_t *abst; const char *ghost; /* if not NULL, the given object is only an empty shell (got used once during the compilation, but was emptied later, probably merged into something else) */ + unsigned compiled:1; /* already compiled, compiler should skip it */ }; typedef struct csch_acomp_s csch_acomp_t; Index: trunk/src/libcschem/compile.c =================================================================== --- trunk/src/libcschem/compile.c (revision 7613) +++ trunk/src/libcschem/compile.c (revision 7614) @@ -480,10 +480,14 @@ return csch_compile_sheet_(dst, viewid, src); } -RND_INLINE void csch_compile_post_comp(csch_project_t *proj, int viewid, csch_abstract_t *dst, csch_acomp_t *comp) +/* 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; + if (comp->hdr.compiled) return 0; + comp->hdr.compiled = 1; + csch_eng_call(proj, viewid, CSCH_ENGHK_COMPILE_COMPONENT1, FGW_AOBJ, comp, FGW_INVALID); for(p = htsp_first(&comp->ports); p != NULL; p = htsp_next(&comp->ports, p)) @@ -490,6 +494,7 @@ csch_eng_call(proj, viewid, CSCH_ENGHK_COMPILE_PORT, FGW_AOBJ, p->value, FGW_INVALID); csch_eng_call(proj, viewid, CSCH_ENGHK_COMPILE_COMPONENT2, FGW_AOBJ, comp, FGW_INVALID); + return dst->new_comps; } int csch_compile_post(csch_project_t *proj, int viewid, csch_abstract_t *dst) @@ -497,8 +502,11 @@ htsp_entry_t *e; csch_sheet_t *sheet; + restart_comp:; + dst->new_comps = 0; for(e = htsp_first(&dst->comps); e != NULL; e = htsp_next(&dst->comps, e)) - csch_compile_post_comp(proj, viewid, dst, e->value); + 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 */ 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);