home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #3 / NN_1993_3.iso / spool / alt / sources / 3088 < prev    next >
Encoding:
Text File  |  1993-01-25  |  24.9 KB  |  519 lines

  1. Path: sparky!uunet!spool.mu.edu!nigel.msen.com!hela.iti.org!cs.widener.edu!dsinc!ub!galileo.cc.rochester.edu!ee.rochester.edu!rbc!al
  2. From: al@rbc.uucp (Al Davis)
  3. Newsgroups: alt.sources
  4. Subject: ACS  circuit simulator  part 04/20
  5. Message-ID: <1993Jan25.052105.4716@rbc.uucp>
  6. Date: 25 Jan 93 05:21:05 GMT
  7. Sender: al@rbc.uucp (Al Davis)
  8. Organization: Huh?
  9. Lines: 508
  10.  
  11. #! /bin/sh
  12. # This is a shell archive, meaning:
  13. # 1. Remove everything above the #! /bin/sh line.
  14. # 2. Save the resulting text in a file.
  15. # 3. Execute the file with /bin/sh (not csh) to create the files:
  16. #    man/Tech
  17. # This archive created: Mon Jan 25 00:17:42 1993
  18. export PATH; PATH=/bin:$PATH
  19. if test ! -d 'man/Tech'
  20. then
  21.     mkdir 'man/Tech'
  22. fi
  23. cd 'man/Tech'
  24. if test -f 'addmodel.tex'
  25. then
  26.     echo shar: will not over-write existing file "'addmodel.tex'"
  27. else
  28. cat << \SHAR_EOF > 'addmodel.tex'
  29. % addmodel  01/23/93
  30. % man Tech addmodel .
  31. % Copyright 1983-1992   Albert Davis
  32. %------------------------------------------------------------------------
  33. \section{Model addition}
  34. \index{model addition}
  35.  
  36. This section attempts to help the engineer to add new models.  It is assumed
  37. that the source for the existing models is available.  This is not a
  38. step-by-step procedure, but instead an attempt to help the reader understand
  39. the process.  The sources, particularly the {\tt d\_*} files should be
  40. studied as examples.
  41.  
  42. In general, anything that can appear in a netlist is considered to be an
  43. element here, including comments and dot cards.
  44.  
  45. One of the goals of the program was to use it as a research tool in device
  46. modeling.  It was designed so that the researcher can concentrate on the
  47. physics and not worry about the details of convergence checking and loading
  48. the solution matrix.  There are functions provided to load the matrix,
  49. expand subcircuits, probe elements, parse and print the description strings,
  50. and other details that need to be done but are distractions for the
  51. researcher.
  52.  
  53. Note: This section was written quickly for an older version of the program.
  54. There have been significant changes.  There are errors in details but it is
  55. still a good approximation of what is there.
  56. %------------------------------------------------------------------------
  57. \subsection{Functions}
  58.  
  59. For each element type there are (presently) 15 functions that may be
  60. provided.  All entry points are contained in a structure ({\tt struct
  61. functions} defined in {\tt branch.h}).  Every line in the netlist, including
  62. models, ``dot cards'' and comments, has this same group of functions.  Some
  63. of the functions can be omitted in cases where they are meaningless.  Any
  64. that are omitted should be defined as NULL, with a cast to the appropriate
  65. return type.  The programmer installing a new device or model must provide
  66. these functions.
  67. %------------------------------------------------------------------------
  68. \subsubsection{create}
  69.  
  70. The {\tt create} function creates an element of the appropriate type, as a
  71. copy of a prototype.  Its one argument {\tt proto} is a prototype to copy.
  72. If {\tt proto} is NULL, all parameters are defaulted.  {\tt Create} returns
  73. a pointer to the newly created element.
  74.  
  75. The new element has the appropriate memory allocated to it, but it is not
  76. linked into any list.  Normally, a call to {\tt parse} will fill in all the
  77. actual values, and a call to {\tt insertbranch} will insert it into the
  78. appropriate list, but neither of these are of concern to the person adding
  79. new models.
  80.  
  81. Usually, all that is necessary is a call to {\tt createbranch}, with three
  82. arguments: the complete prototype, the extras prototype, and the address of
  83. the function structure.
  84.  
  85. The {\tt createbranch} function does the following:
  86. \begin{enumerate}
  87. \item Allocate memory for a standard netlist item.
  88. \item Copy the prototype, if provided, otherwise set the connection nodes to
  89. {\em invalid}.
  90. \item Set the pointer to the function structure, if provided, otherwise
  91. leave it as in the prototype.  This identifies what type of element this is.
  92. \item Set the node pointer to point to where the nodes are.
  93. \item Set the {\em subckt} pointer to {\tt NULL}, to indicate not expanded.
  94. \item Create the nonstandard part.
  95. \item Set linked list links to {\tt NULL}.
  96. \item Zero flags.
  97. \end{enumerate}
  98.  
  99. {\em Create the nonstandard part} consists of:
  100. \begin{enumerate}
  101. \item Allocate memory, the same size block as the prototype.
  102. \item Copy the prototype into the new block.
  103. \item Recursively handle additional blocks the same way.
  104. \end{enumerate}
  105.  
  106. After {\tt createbranch} returns, additional changes can be made.  There are
  107. two cases where existing code does this.  Models are accessed fast through a
  108. {\em same type} list, so one of the pointers is set to facilitate the link.
  109. Subcircuits may have more than four connection nodes, so the node pointer is
  110. set to point to the nonstandard part where the node numbers are actually
  111. stored.
  112.  
  113. Simple elements, such as ordinary resistors, have no nonstandard part.  Most
  114. other elements have one nonstandard part, but may have as many as needed.
  115. The mosfet model has two.  It includes a diode model.  This enables
  116. new types to build on the old ones, using their data structures.
  117. %------------------------------------------------------------------------
  118. \subsubsection{parse}
  119.  
  120. The {\tt parse} function parses an input string, and fills in the actual
  121. values.  It takes 3 arguments: a raw element ({\em brh}), with the
  122. defaults (or old values) filled in, the input string ({\em cmd}), and an
  123. index ({\em cnt}) into the input string.  It scans the input string, fills
  124. in all the parameters that are specified, and calculates some additional
  125. ones.
  126.  
  127. For simple elements, such as resistors, a single call to {\tt parsegeneric}
  128. does the job.  {\tt Parsegeneric} takes four arguments, the three that {\tt
  129. parse} is called with, and the ``correct'' number of nodes.  It will handle
  130. the standard form of {\em label}, {\em nodes}, {\em value}, where {\em
  131. value} is either a number or an expression.  
  132.  
  133. In some cases you may want to change the functions after or during parsing.
  134. For example, the resistor uses different functions depending on whether it
  135. is simple or a behavioral model.  Solid state devices use different function
  136. for different models.
  137.  
  138. In the more general case, for more complicated models likely to be
  139. installed, it is necessary to process the tokens in the input string one at
  140. a time, in order.  For circuit elements, such as mosfets and diodes, there
  141. are a few specialized functions to help this, as well as some general
  142. purpose string functions.  For other items, such as {\tt .model} cards, you
  143. are mostly on your own, but there are some string functions available that
  144. might help.
  145.  
  146. Since circuit elements all start with a label, then connections, there are
  147. functions provided for this.  You must use them.  {\tt Parselabel} reads the
  148. label from the input string, checks for validity, and puts it in the
  149. appropriate place.  {\tt Parsenodes} reads the nodes (connections), checks
  150. for validity, and stores them in the appropriate place.
  151.  
  152. After that, you must read the arguments.  {\tt Ctostr} reads a string.  {\tt
  153. Ctof} reads a floating point number.  {\tt Argparse} reads a list of
  154. arguments.  The existing code provides good examples of their usage.
  155.  
  156. After you have read all reasonable input, call {\tt syntax} to check what
  157. remains of the input string.  {\tt Syntax} will print a message if there is
  158. more text left in the buffer.
  159.  
  160. After reading the input the {\tt parse} function must calculate missing
  161. parameters, if necessary, and print error messages when conflicts arise or
  162. inappropriate values are entered.  The mosfet {\tt parse} function does
  163. extensive error checking and arbitration and can be used as an example.  In
  164. some cases it is a good idea to set flags when certain values are input, so
  165. it is possible to tell whether they were input, defaulted, or calculated.
  166.  
  167. It must be possible to call {\tt parse} twice (or more) on the same string,
  168. with the same results as calling it once.
  169. %------------------------------------------------------------------------
  170. \subsubsection{print}
  171.  
  172. The {\tt print} function prints an element description, in a form such that
  173. it can be read by the {\tt parse} function to re-create the same element.
  174. It takes 2 arguments:  the element {\em brh}, and where to print it {\em
  175. where}.
  176.  
  177. For simple elements a call to {\tt printgeneric} is all that is necessary.
  178. In the more general case, it is necessary to print the information an item
  179. at a time.  Functions are provided to print the label ({\tt printlabel}) and
  180. the connections ({\tt printnodes}).  You must use these functions.  Most
  181. other data should be printed using the {\tt mprintf} function, a variation
  182. on the standard C {\tt printf} function, with identical syntax, except for
  183. the type of the file argument, for which {\tt mprintf} takes {\tt where}
  184. directly.  The function {\tt ftos} generates a string in abbreviated
  185. notation, with a fixed field width (example: 10.5K) from a floating point
  186. number.
  187.  
  188. You do not have to be concerned about line length, because it will
  189. automatically be wrapped to the correct width, but it will not break text
  190. contained in a single call to {\tt mprintf}.  You may force a new line, by
  191. printing ``\verb=\n='', and beginning the next (continuation) line with
  192. ``{\tt +}''.
  193.  
  194. You may print out comments, by starting a new line with ``{\tt *}''.  You
  195. may print comments to be thrown away when the file is read by starting a new
  196. line with ``{\tt *+}''.  In general, any comments generated by the program
  197. should be of the throw away type, otherwise duplicate comments will
  198. accumulate in files that are changed and saved repeatedly.  Comments must
  199. follow the data, because the continuation does not work across comments.
  200.  
  201. In general, you should print out all parameters, including those that are
  202. defaulted.  You should not print the parameters that are calculated by the
  203. program, because you probably want them to be calculated again next time.
  204. Instead, print them as comments.
  205. %------------------------------------------------------------------------
  206. \subsubsection{expand}
  207.  
  208. The {\tt expand} function does pre-processing of a circuit element.  It is
  209. called once, on the start of a simulation command, if anything has changed.
  210.  
  211. Some tasks that should be done here are:
  212.  
  213. \begin{enumerate}
  214.  
  215. \item Check to see if the element has already been expanded.  If it has,
  216. only some of the work needs to be done over, in case a parameter has changed.
  217.  
  218. \item If the element references a {\em .model}, search for the appropriate
  219. {\em .model}, and make the appropriate links to it.
  220.  
  221. \item Do one-time calculations.  In many cases, some calculations are not
  222. dependent on voltages or currents, so can be calculated once.  This should
  223. be done here.  Examples of calculations that should be done here include
  224. actual diode saturation current and capacitances (and many others).
  225.  
  226. \item Build a copy of a subcircuit.  In many cases, elements are composed of
  227. subcircuits of several elements.  The copy, with actual parameters and node
  228. numbers plugged in, should be built here, and attached at {\tt brh->subckt}.
  229. The most obvious of these is the subcircuit call, but most active devices
  230. and voltage sources expand into an equivalent network of simpler elements.
  231. The usual procedure is to call the prototype element's {\tt create} function
  232. to create a copy, change the appropriate values to suit, then insert it into
  233. the new subcircuit.
  234.  
  235. \end{enumerate}
  236.  
  237. For simple elements, like resistors, {\em expand} is not required, and could
  238. be set to {\tt NULL}.  It may still be useful to do some pre-calculations,
  239. such as the value of $1/R$.  This is also a good time to check to see if a
  240. simpler model can be used, for example, if behavioral modeling is not used,
  241. skip the calls to its evaluation.
  242.  
  243. The {\tt expand} function, for a model, comment, or dot card is usually {\tt
  244. NULL}.
  245.  
  246. It must be possible to expand an element more than once, and maintain
  247. correct results.  This means it is not permissible to use the same variable
  248. for different purposes before and after expansion.  Be careful not to
  249. allocate memory for additional parameters and subcircuits multiple times.
  250. %------------------------------------------------------------------------
  251. \subsubsection{trprobe}
  252.  
  253. Probe the circuit for data, in DC or transient analysis.  Given 2
  254. arguments:  {\em brh}, the element, and {\em probe}, a string representing
  255. what information we want, it returns the appropriate voltage, current, or
  256. whatever was asked for.  The information desired includes voltages,
  257. currents, power dissipations, linearized values, error calculations, and
  258. others that may be added in the future.  The possible values of {\em probe}
  259. depend on the device.  In all cases, the strings are those entered in the
  260. {\tt print} or {\tt plot} command, converted to lower case.  For example,
  261. {\tt print tran vds(m12)} calls {\tt m12}'s {\tt trprobe} function with the
  262. string ``{\tt vds}''.  The function probably should interpret ``{\tt vds}''
  263. to mean the drain to source voltage.  It should return the constant NOTVALID
  264. if the string does not match anything.
  265. %------------------------------------------------------------------------
  266. \subsubsection{acprobe}
  267.  
  268. Probe the circuit for data, in AC analysis.  This is similar to {\em
  269. trprobe} except that it may have a different set of values that are
  270. appropriate for frequency domain analysis.
  271. %------------------------------------------------------------------------
  272. \subsubsection{dotr}
  273.  
  274. The {\tt dotr} function does transient and DC model evaluation, for full
  275. Newton iteration.  It does a full evaluation of the model, and loads the
  276. appropriate values into the admittance matrix and right-side.  It is the
  277. responsibility of this function to do integration, interpolation, iteration,
  278. or whatever is required.  It also updates AC equivalent values, and returns
  279. a convergence status.
  280.  
  281. There are two ways to handle this: you can code the full evaluation, and
  282. treat it as a simple component, like a resistor or controlled source, or you
  283. can use a subcircuit approach, where the work is deferred to the elements of
  284. the subcircuit.  It is also possible to combine the two methods.  For new
  285. sophisticated models, the subcircuit approach is recommended, using the
  286. pre-defined simple elements to do the real work.
  287.  
  288. Assuming you are using the subcircuit approach, all that is necessary is to
  289. call the function {\tt trfilllist} with the argument {\tt brh->subckt}.
  290. This will process the subcircuit.  The function should return the
  291. convergence status, which is what {\tt trfilllist} returns.  If the {\tt
  292. expand} function was designed correctly, a call to {\tt trfilllist} may be
  293. all that is necessary.  See the diode model as an example.
  294.  
  295. For a ``simple'' element, that does not use a subcircuit, there are several
  296. steps that must be performed.
  297.  
  298. \begin{enumerate}
  299.  
  300. \item Save the old values of admittance, intercept, and input, for
  301. convergence checking.  This should be done by a call to {\tt trsetup}.
  302.  
  303. \item Determine the present input, and save it in {\tt brh->m.tr.x0}.
  304.  
  305. \item Evaluate the model equations, leaving the resulting effective
  306. admittance in {\tt brh->y0.c1} and intercept in {\tt brh->y0.c0}.  Calculate
  307. an effective AC value (often the same as effective admittance) and save it
  308. in {\tt brh->ev}.
  309.  
  310. \item Load the system matrix.  The function {\tt trloadpassive} loads a
  311. passive element, where input and output terminals are the same, as in a
  312. resistor, so the matrix entries are symmetric about the diagonal.  The
  313. function {\tt trloadactive} loads an active element, where input and output
  314. terminals are different, for example, a controlled source, so the matrix
  315. entries are asymmetric.  The function {\tt trloadsource} loads only the
  316. right side vector, and nothing into the admittance matrix, and is used for
  317. fixed sources.  You should call one of these, depending on the type of
  318. element.  You should not attempt to access the matrices directly.
  319.  
  320. \item Check convergence, and return the result.  If the element is known to
  321. be linear, this step means to simply return the value {\tt YES}.  If the
  322. element is nonlinear, a call to {\tt conv\_check} will do the necessary
  323. convergence checking.
  324.  
  325. \end{enumerate}
  326. %------------------------------------------------------------------------
  327. \subsubsection{untr}
  328.  
  329. The {\tt untr} function unloads an element from the matrix.  It is used for
  330. incrementally updating the matrix.
  331. %------------------------------------------------------------------------
  332. \subsubsection{doac}
  333.  
  334. The {\tt doac} function does AC model evaluation.  It evaluates the model
  335. for AC analysis, and loads the admittance matrix and right-side.  It assumes
  336. that the DC operating point has been set, by doing the appropriate {\em op},
  337. {\em dc}, or {\em transient} analysis.  In some cases, it simply takes the
  338. equivalent values calculated by {\em dotr}.
  339.  
  340. Like in {\tt dotr}, you can either code the full evaluation, and treat it as
  341. a simple component, or use the subcircuit approach.  The {\tt doac} function
  342. must use the same approach as {\tt dotr}.  The full evaluation approach can
  343. often be simplified to using the value {\tt brh->ev} without further
  344. calculations.
  345.  
  346. With the subcircuit apporach, a call to {\tt acfilllist} will process the
  347. subcircuit.
  348.  
  349. For a ``simple'' element, some equations must be evaluated, unless they were
  350. done by {\tt dotr}.  The procedure is essentially the same as {\tt dotr}
  351. except that there is no convergence checking, and no need to save old
  352. values.  You need to calculate an effective AC admittance, and possibly
  353. source value, with real ({\tt brh->m.ac.g.x}) and imaginary ({\tt
  354. brh->m.ac.g.y}) parts.  The function {\tt acloadpassive} loads a passive
  355. element into the admittance matrix.  If it is known that either the real or
  356. imaginary part is zero, you may use {\tt acloadpassivereal} or {\tt
  357. acloadpassiveimaginary} instead.  For an active element, use {\tt
  358. acloadactive}.  For a fixed source, use {\tt acloadsource}.
  359. %------------------------------------------------------------------------
  360. \subsubsection{trguess}
  361.  
  362. The {\tt trguess} function is supposed to provide an initial guess for
  363. iteration.  It is not implemented.
  364. %------------------------------------------------------------------------
  365. \subsubsection{tradvance}
  366.  
  367. The {\tt tradvance} function is supposed to do the first evaluation at a new
  368. time step.  It is not implemented.
  369. %------------------------------------------------------------------------
  370. \subsubsection{trreview}
  371.  
  372. The {\tt trreview} function checks errors and signal conditions after a time
  373. step has converged.  It makes entries into the event queue, makes mode
  374. decisions for mixed-mode simulation, and evaluates time step dependent
  375. errors.  It returns an approximate time that the element wants for the next
  376. step.  The actual next time step will probably be sooner than the value
  377. returned.
  378. %------------------------------------------------------------------------
  379. \subsubsection{trfun1}
  380.  
  381. The {\tt trfun1} function evaluates nonlinearities for transient and DC
  382. analysis.  In some cases, an otherwise ordinary device has special
  383. nonlinearities.
  384.  
  385. For example, a diode can be considered a special type of resistor, with an
  386. exponential transfer characteristic.  The model for a resistor could be
  387. used, but {\em trfun1} patched to call a special function to evaluate the
  388. resistor's behavior, in this case, the diode equation.  It returns a first
  389. order polynomial representing the tangent line to the curve, at a point
  390. determined by the prior iteration.  The actual code for the diode uses an
  391. admittance, with {\tt trfun1} patched to evaluate the diode equation, in
  392. parallel with a capacitor, {\tt trfun1} patched to evaluate the nonlinear
  393. capacitance.
  394.  
  395. The usual method of building a special model is to use a subcircuit
  396. expansion, with almost ordinary elements, such as resistors, capacitors, and
  397. controlled sources, with a special evaluation function, hooked at {\tt
  398. trfun}.  Both the diode and mosfet are examples of models built this way.
  399.  
  400. {\em Trfun1} must evaluate the function and its first derivative.  It also
  401. evaluates time dependencies, if any.  It returns the result as a first order
  402. polynomial: the slope and intercept of the line tangent to the curve.
  403. %------------------------------------------------------------------------
  404. \subsubsection{trfun0}
  405.  
  406. The {\tt trfun0} function is a relaxation version of {\tt trfun1}.  It is
  407. not implemented.
  408. %------------------------------------------------------------------------
  409. \subsubsection{acfun}
  410.  
  411. The {\tt acfun} function evaluates nonlinearities for AC analysis, as {\tt
  412. trfun} does for transient and DC analysis.  The return value is a complex
  413. effective value.  It is used less often, because the {\tt dotr} saves an AC
  414. effective value, which can usually be used without further calculations.
  415. %------------------------------------------------------------------------
  416. \subsection{Hooks}
  417.  
  418. There are three places where existing code must be changed to accomodate the
  419. new model.
  420.  
  421. \begin{enumerate}
  422.  
  423. \item Add the declaration to the file {\tt types.h}.
  424.  
  425. \item Change the function {\tt cparse} in the file {\tt getckt.c} to assign
  426. a letter to the new device.  ({\tt for circuit elements, or anything that
  427. starts with a particular character})
  428.  
  429. \item Change the function {\tt parse\_dot\_model} in the file {\tt
  430. dev\_dot.c} to match a keyword to a new model.  ({\tt .Model card only})
  431.  
  432. \end{enumerate}
  433. %------------------------------------------------------------------------
  434. %------------------------------------------------------------------------
  435. SHAR_EOF
  436. fi # end of overwriting check
  437. if test -f 'datastruct.tex'
  438. then
  439.     echo shar: will not over-write existing file "'datastruct.tex'"
  440. else
  441. cat << \SHAR_EOF > 'datastruct.tex'
  442. % datastruct  01/23/93
  443. % man Tech datastruct .
  444. % Copyright 1983-1992   Albert Davis
  445. %------------------------------------------------------------------------
  446. \section{Data Structures}
  447. %------------------------------------------------------------------------
  448. Note: This section was written for an older version of the program.  There
  449. have been significant changes.  There are errors in details but it is still
  450. a good approximation of what is there.
  451. %------------------------------------------------------------------------
  452. \subsection{Parts list}
  453. \index{internals: parts list}
  454. \index{parts list: internals}
  455. %------------------------------------------------------------------------
  456. \subsubsection{Ring structure}
  457. \index{internals: ring structure}
  458. \index{ring structure: internals}
  459.  
  460. Internally, the parts list is stored as a bi-directional linked list, in a
  461. ring structure.  There is no explicit head or tail.  A call to the function
  462. {\em insertbranch} makes a copy of the structure, and makes all the
  463. appropriate links.
  464.  
  465. To insert a branch into a particular list, set up one link, before calling
  466. {\em insertbranch}.  The rest is automatic.  If both links are set to NULL,
  467. the new device will be placed in its own new list, with itself as the only
  468. member.
  469.  
  470. The function {\em deletebranch} deletes the branch and its children.  (See
  471. delete list, next subsection.)  Links of surrounding elements are patched to
  472. close the list.
  473.  
  474. There are many such rings.  The main circuit is one.  Each subcircuit and
  475. model has another.  Some functions, {\em acfilllist} and {\em trfilllist},
  476. for example, take a pointer to a list.  The pointer can be to any member of
  477. the list.  The function will act on the entire list.
  478.  
  479. Some rings do have an explicit head-tail.  A dummy element acts as both head
  480. and tail.  There are two reasons why some lists need this explicit head and
  481. tail.  First, it is important, for visual purposes, to preserve the start
  482. and end of the list.  Second, it is possible to have an empty list, for
  483. example, no circuit.  Without this dummy element, it would not be possible
  484. to keep an empty list.  The main circuit has a dummy element.  Subcircuits
  485. do not.
  486. %------------------------------------------------------------------------
  487. \subsubsection{Delete list}
  488. \index{internals: delete}
  489. \index{delete: internals}
  490.  
  491. The first two fields of the generic structure are links to the next member
  492. of two singly linked delete lists.  The first ({\em chain\/}) points to
  493. blocks belonging to the parent.  The second ({\em x\/}) points to blocks
  494. belonging to itself.  When any element is deleted, the memory blocks pointed
  495. to by both of these fields are also deleted, recursively.
  496.  
  497. This extends to all sub-structures used in models.  They are not necessarily
  498. of the same type, but the first two fields must be links to the next element in
  499. a delete list.  Since these structures are of different types, if they are
  500. part of another list, links are not patched.  Usually, this is used to
  501. delete an entire list.
  502.  
  503. Additional space required by this element is linked at {\em x}.  Examples of
  504. data linked here include storage for model parameters, results of internal
  505. calculations, and the head of a subcircuit expansion.
  506.  
  507. Examples of space linked at {\em chain} include mainly additional subcircuit
  508. expansion elements.  The first element is linked at {\em x}.  Additional
  509. elements are linked at {\em chain}.  To find the owner of an element linked
  510. at {\em chain}, trace back through the linked list until one is linked at
  511. {\em x}.
  512. %------------------------------------------------------------------------
  513. %------------------------------------------------------------------------
  514. SHAR_EOF
  515. fi # end of overwriting check
  516. cd ..
  517. #    End of shell archive
  518. exit 0
  519.