Module testthis { \\ empty stack Flush inventory LL append LL, "des_system_lib":=(List:="std", "synopsys", "std_cell_lib", "des_system_lib", "dw02", "dw01", "ramlib", "ieee") REM append LL, "dw01":=(List:="dw04","ieee", "dw01", "dware", "gtech") append LL, "dw01":=(List:="ieee", "dw01", "dware", "gtech") append LL, "dw02":=(List:="ieee", "dw02", "dware") append LL, "dw03":=(List:="std", "synopsys", "dware", "dw03", "dw02", "dw01", "ieee", "gtech") append LL, "dw04":=(List:= "ieee", "dw01", "dware", "gtech") append LL, "dw05":=(List:="dw05", "ieee", "dware") append LL, "dw06":=(List:="dw06", "ieee", "dware") append LL, "dw07":=(List:="ieee", "dware") append LL, "dware":=(List:="ieee", "dware") append LL, "gtech":=(List:="ieee", "gtech") append LL, "ramlib":=(List:="std", "ieee") append LL, "std_cell_lib":=(List:="ieee", "std_cell_lib") append LL, "synopsys":=List \\ inventory itmes may have keys/items or keys. \\ here we have keys so keys return as item also \\ when we place an item in a key (an empty string) ... \\ we mark the item to not return the key but an empty string inventory final mm=each(LL) while mm k$=eval$(mm!) m=eval(mm) mmm=each(m) While mmm k1$=eval$(mmm!) if not exist(LL, k1$) then if not exist(final, k1$) then append final, k1$ return m, k1$:="" \\ mark that item else mmmm=Eval(LL) if len(mmmm)=0 then if not exist(final, k1$) then append final, k1$ return m, k1$:="" \\ mark that item end if end if end while end while mm=each(LL) while mm \\ using eval$(mm!) we read the key as string k$=eval$(mm!) if exist(final, k$) then continue m=eval(mm) mmm=each(m) While mmm \\ we read the item, if no item exist we get the key k1$=eval$(mmm) if k1$="" then continue if exist(final, k1$) then continue data k1$ \\ push to end to stack end while while not empty read k1$ if exist(final, k1$) then continue m=LL(k1$) mmm=each(m) delthis=0 While mmm k2$=eval$(mmm) if k2$="" then continue if k1$=k2$ then continue if exist(final, k2$) then continue push k2$ \\ push to top of stack return m, k2$:="" delthis++ end while if delthis=0 then if not exist(final, k1$) then mmm=each(m) While mmm k2$=eval$(mmm!) if k2$=k1$ then continue if exist(final, k2$) Else Print "unsorted:";k1$, k2$ end if end while append final, k1$ : Return LL, k1$:=List end if end if end while if not exist(final, k$) then append final, k$ end while document doc$ ret=each(final,1, -2) while ret doc$=eval$(ret)+" -> " end while doc$=final$(len(final)-1!) Report doc$ clipboard doc$ } testthis