jspice3 optimization routine: merit .control # # Determines if a given set of margins is better than previous sets. # Decision is based on marg[0] = minimum normalized margin, # marg[1] = margin width - to + of minimum margin and # marg[2] = sum of all margins. First check marg[0], if it is # unchanged check marg[1] and marg[2]. Output is in vector # better, 1 if yes, 0 if no. # External vectors: # upper[], lower[], flags[], margbest[], better # # External system vectors: # value[] # # Internal vectors: # me_i, me_marg[], me_u, me_l, me_x let me_marg[2] = 0.0 let me_marg[0] = 1.0 let me_i = 0 while (me_i < 20) if (flags[me_i] = 0) let me_i = me_i + 1 continue endif let me_u = abs((upper[me_i] - value[me_i]) / value[me_i]) let me_l = abs((lower[me_i] - value[me_i]) / value[me_i]) if (me_u > me_l) let me_x = me_l else let me_x = me_u endif if (me_x <= me_marg[0]) let me_marg[0] = me_x let me_marg[1] = me_u + me_l endif let me_marg[2] = me_marg[2] + me_u + me_l let me_i = me_i + 1 end # Determine if trial variable set is better. better = 0 if ((me_marg[0] > margbest[0]) or \ (me_marg[0] = margbest[0] and me_marg[1] > margbest[1]) or \ (me_marg[0] = margbest[0] and me_marg[2] > margbest[2])) let better = 1 let margbest[0] = me_marg[0] let margbest[1] = me_marg[1] let margbest[2] = me_marg[2] endif unlet me_marg me_i me_l me_u me_x .endc