PROGRAMMABLE MOLECULAR DEVICE

Abstract: A programmable molecular device (10) is provided that includes a random nano-network that includes a plurality of molecular circuit components. Preferred molecular circuit components include molecular diodes that exhibit negative differential resistance. A method of programming the molecular device may include configuring the molecular components. Configuring a molecular component may include applying a voltage across input and output leads connected to the nano-networks. The voltage may be determined according to a self-adapting algorithm that programs the device to function, for example, as a logic unit or a memory unit. A molecular computer may include a plurality of programmable molecular devices (10) that are interconnected by metallic wires (14).

Description: PROGRAMMABLE MOLECULAR DEVICE STATEMENT REGARDING FEDERALLY SPONSORED RESEARCH OR DEVELOPMENT This work was supported by funding from DARPA through the Office of Naval Research, Grant No. R13160. REFERENCE TO CD-ROM APPENDIX AND STATEMENT UNDER 37 C.F.R § 1.52(e)(5) One compact disk - read only memory (CD-ROM) is attached hereto in duplicate copy ("Copy 1" and "Copy 2") in BM-PC format, compatible with MS-Windows and MS-DOS, and incorporated-by-reference herein, in accordance with 37 C.F.R § 1.52(e)(5). Copy 1 and Copy 2 are identical and contain 269 files in 1 main directory and 2 subdirectories, as identified by the following output from the MS-DOS command "dir e: Is", where the output includes a line in standard format [month/date/year time bytes filename.extension] for each file, identifying, to one of ordinary skill in the computational arts, the date of creation, size, name, and type of each file: Volume in drive E is PatentFiles Directory of E:\ 01/01/01 12:00a <DIR> 01/01/01 12:00a <DPR> 07/24/01 01:59p <DPR> Dynamic Nanocell Simulator 07/24/01 09:34a 250,368 Exhaustive Truth Table Tests.ppt 07/24/01 01:58p <DIR> Spice Nanocell Simulator 07/24/01 01:30p 44,553,216 Trained Nanocell.doc 6 File(s) 44,803,584 bytes Directory of E:\Dynamic Nanocell Simulator 07/24/01 09:34a <DΓR> 07/24/01 09:34a <DΓR> 07/24/01 01:59p <DIR> molec 07/23/01 09:43a 2,341 SimCellVl.jcp 07/10/01 12:09p 390 SimCellVl.jcw 07/11/01 12:42p 239 SimCellV12.jcw 07/24/01 01:59p <DIR> src 07/18/01 07:53a 1,022 src_simcellvl.txt 8 File(s) 3,992 bytes Directory of E:\Dynamic Nanocell SimulatoΛmolec 07/24/01 01:58p <DΓR> 07/24/01 01:58p <DIR> 07/24/01 01:59p <DIR> cell 07/24/01 01:59p <DΓR> control 7/24/01 01:59p <DΓR> 7/24/01 01:59p <DΓR> table 7/24/01 01:59p <DIR> ui 7 File(s) 0 bytes Directory of E:\Dynamic Nanocell Simulator\molec\cell 4/16/01 01:07p <DIR> 4/16/01 01:07p <DΓR> 7/18/01 07:54a 490 Lin .class 7/18/01 07:54a 9,255 Nanocell.class 7/18/01 07:54a 1,206 Node.class 7/18/01 07:54a 1,503 Util.class 6 File(s) 12,454 bytes Directory of E:\Dynamic Nanocell Simulator\molec\control 7/18/01 07:54a <DΓR> , . 7/18/01 07:54a <DΓR> 7/18/01 07:54a 2,372 nanoControl$l. class 7/18/01 07:54a 2,060 nanoControl$10.class 7/18/01 07:54a 1,942 nanoControl$l 1. class 7/18/01 07:54a 745 nanoControl$12.class 7/18/01 07:54a 839 nanoCoπtrol$ 13. class 7/18/01 07:54a 745 nanoControl$14.class 7/18/01 07:54a 1,426 nanoControl$ 15. class 7/18/01 07:54a 835 nanoControl$ 16. class 7/18/01 07:54a 751 nanoControl$17.class 7/18/01 07:54a 2,083 nanoControl$18.class 7/18/01 07:54a 751 nanoControl$ 19.class 7/18/01 07:54a 1,251 nanoContr.ol$2.class 7/18/01 07:54a 1,560 nanoControl$20.class 7/18/01 07:54a 1,383 nanoControl$2 class 7/18/01 07:54a 1,054 nanoControl$22.class 7/18/01 07:54a 749 nanoControl$23.class 7/18/01 07:54a 846 nanoControl$24.class 7/18/01 07:54a 749 nanoControl$25.class 7/18/01 07:54a 2,672 nanoControl$26.class 7/18/01 07:54a 1,251 nanoControl$3. class 7/18/01 07:54a 1,213 nanoControl$4.class 7/18/01 07:54a 1,233 nanoControl$5. class 7/18/01 07:54a 1,278 nanoControl$6. class 7/18/01 07:54a 744 nanoControl$7. class 7/18/01 07:54a 1,290 nanoControl$8.class 7/18/01 07:54a 744 nanoControl$9. class 7/18/01 07:54a 5,091 nanoControl.class 29 File(s) 37,657 bytes Directory of E:\Dynamic Nanocell Simulator\molec\ga 7/18/01 07:54a <DIR> 7/18/01 07:54a <DΓR> 7/18/01 07:54a 158 Evaluatable.class 7/18/01 07:54a 4,057 GA.class 7/18/01 07:54a 2,176 Individual.class 7/18/01 07:54a 3,132 Population.class 7/18/01 07:54a 1,020 Util.class 7 File(s) 10,543 bytes Directory of E:\Dynamic Nanocell Simulator\molec\table 7/18/01 07:54a <DIR> 7/18/01 07:54a <DΓR> 7/18/01 07:54a 2,128 TruthTable.class 3 File(s) 2,128 bytes Directory of E:\Dynamic Nanocell Simulator\molec\ui 7/18/01 07:54a <DIR> 7/18/01 07:54a <DΓR> 7/18/01 07:54a 6,747 GCell.class 7/24/01 01:59p <DIR> inputWindows 7/18/01 07:54a 487 mainMenu$l. class 7/18/01 07:54a 5,985 mainMenu.class 7/18/01 07:54a 427 NodeCheckBoxMenuItem.class 7 File(s) 13,646 bytes Directory of E:\Dynamic Nanocell Simulator\molec\ui\inputWin 7/24/01 01:59p <DIR> 7/24/01 01:59p <DIR> 7/18/01 07:54a 2,517 AInputWindow. class 7/18/01 07:54a 656 GAPropsWin.class 7/18/01 07:54a 1,068 makeNano.class 7/18/01 07:54a 2,775 PropsGui.class 7/18/01 07:54a 701 SimPropsWin.class 7/18/01 07:54a 3,006 TableGui.class 8 File(s) 10,723 bytes Directory of E:\Dynamic Nanocell Simulator\src 7/24/01 01:59p <DΓR> 7/24/01 01:59p <DIR> 7/24/01 01:59p <DI > cell 7/24/01 01:59p <DIR> control 7/24/01 01:59p <DJH> ga 7/24/01 01:59p <DE > table 7/24/01 01:59p <DB > ui 7 File(s) 0 bytes Directory of E:\Dynamic Nanocell Simulator\src\cell 7/24/01 01:59p <DΓR> 7/24/01 01:59p <D > 5/11/01 02:33p 516 Link.java 7/17/01 01:32p 30,722 Nanocell.java 7/09/01 11:18a 1,230 Node.java 4/04/01 09:37a 1,312 Util.java 6 File(s) 33,780 bytes Directory of E:\Dynamic Nanocell Simulator\src\control 4/04/01 09:37a <DIR> 4/04/01 09:37a <DIR> 7/18/01 03:45p 20,315 nanoControl.java 3 File(s) 20,315 bytes Directory of E:\Dynamic Nanocell Simulator\src\ga 7/18/01 03:45p <DIR> 7/18/01 03:45p - <DΓR> 4/17/01 06:59p 87 Evaluatable.java 7/14/01 06:40a 6,716 GA.java 7/14/01 06:16a 3,268 Individual.java 6/11/01 10:32a 4,467 Population.java 6/16/01 06:00a 854 Util.java 7 File(s) 15,392 bytes Directory of E:\Dyn amic Nanocell Simulator\src\table 7/14/01 06:40a <DΓR> 7/14/01 06:40a <DIR> 4/17/01 06:56p 2,074 TruthTable.java 3 File(s) 2,074 bytes Directory of E:\Dynamic Nanocell Simulator\src\ui 4/17/01 06:56p <DΓR> 4/17/01 06:56p <DΓR> 7/14/01 05:39a 9,636 GCell.java 7/24/01 01:59p <DIR> images 7/24/01 01:59p <DIR> inputWindows 5/23/01 01:49p 9,295 mainMenu.java 4/06/01 09:15a 327 NodeCheckBoxMenuItem.java 7 File(s) 19,258 bytes Directory of E:\Dyn amic Nanocell Simulator\src\ui\images 7/18/01 07:54a <DIR> 7/18/01 07:54a <DΓ > 2/05/01 05:07p 291 cell_prop.gif 2/05/01 04:50p 1,087 chip.gif 6/02/00 11:11a 885 clone.gif 6/02/00 11:11a 81 hand.gif 6/02/00 11:11a 1,476 looping.gif 2/05/01 02:45p 235 middle.gif 2/05/01 05:02p 843 molecule.gif 6/02/00 11:11a 139 new.gif 6/02/00 11:11a 146 open.gif 6/02/00 11: 11a 184 save.gif 6/02/00 11:11a 852 start.gif 6/02/00 11:11a 858 stop.gif 2/05/01 04:5 lp 1,422 truth.gif 2/05/01 05:05p 211 zap.gif 16 File(s) 8,710 bytes Directory of E:\Dynamic Nanocell Simulator\src\ui\inpufWmdo 2/05/01 05:05p <DΓR> 2/05/01 05:05p <DIR> 6/05/01 01:31p ' 2,592 AInputWindow.java 7/13/01 10:01p 522 GAPropsWin.java 7/03/01 02:31p 691 makeNano.java 7/03/01 02:35p 2,007 PropsGui.java 7/13/01 03:36p 526 SimPropsWin.java 2/28/01 01:04p 2,744 TableGui.java 8 File(s) 9,082 bytes Directory of E:\Spice Nanocell Simulator LΛ 4^ LO LO o LΛ O LΛ O LΛ O LΛ LΛ O O i δ W δδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδ o o o O i-- O O i— O O i-^ O O i— i— O O >— i-. i-. O i— i- 1 o i— o o o o >-> »-. i— - -J 4-. 3 ^ to to _>— to (-• ^ p ; .£. t-" to to ;o 4^ H-. *- j-^ 4. _qs to to _^ jo _^ to to to ►-> ^ _o p > O -MJ1 M H I O t j. ω ω ω t i- H ji ji. h' H ώ ώ jk iό ^ ώ i ^ tό ώ Lή ώ ii tό iό i- u ^ ό ώ tό o ω ii ώ ό ό ^. to u ώ ii tό tό tό Lή ϋn ϋι t0 4i tό iO L Uι Uι U ^ M W ^ t0 O O U O Ul ∞ ω j- IX) lΛ O O IO (0000\ 00 t0 Uι 0\ l Uι υι ) -MΛ Λ tΛ Ul M t iO O t O O O\ ^ υι υι ι- u σ» 4^ ι u j- vo vD • σ 'd 'ϋ 'd O 'α τi 'σ Ti 'α 'σ O ' TS Ό TJ Ό Ό -D T-! P -α 'd 'ϋ 'd 'ϋ O 'c ij O O 'ϋ 'ϋ 'd ' 'C P Ό T3 J Tj O T3 P T3 O O O T3 O 3 O O O *O o LΛ LΛ 4^ LO tO t LΛ O LΛ 4^ LO O LΛ O LΛ o LΛ ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo i— t O t M i— ►— to β Λ ω co io ji vo o o " o"oo"oc3ooδooδoooδδoδoδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδδ 120 File(s) 1,083,699 bytes Directory of E:\Spice Nanocell SimulatortDebug 07/24/01 ' 01:59p <DIR> 07/24/01 01:59p <DIR> 07/05/01 11:27a O AUScores 07/23/01 02:10p 5,161,984 mcό.bsc 4 File(s) 5,161,984 bytes Directory of E:\Spice Nanocell SimulatoΛres 07/05/01 11:27a <DIR> 07/05/01 11:27a <DIR> 01/17/01 08:59p 1,078 mcό.ico 01/13/01 04:31p 395 mc6.rc2 01/13/01 04:31p 1,078 mcόDoc.ico 03/09/01 02:57p 778 Toolbar.bmp 04/16/01 01:07p 96 vssver.scc 7 File(s) 3,425 bytes Total Files Listed: 269 File(s) 51,252,446 bytes 0 bytes free FIELD OF THE INVENTION The present invention relates generally to programmable electronic devices, more particularly programmable nano-scale devices based on molecular circuit components. BACKGROUND OF THE INVENTION Basic functions of a computer include information processing and storage. In von Neumann (serial) architectures, those arithmetic, logic, and memory operations are performed by devices that are capable of reversibly switching between two states often referred to as "0" and "1." Semiconducting devices that perform these various functions must be capable of switching between two states at a very high speed using minimum amounts of electrical energy in order to allow the computer to perform basic operations. Transistors perform the basic switching functions in computers. While the design and production of energy-efficient, state-of-the-art electronic devices depend increasingly on the ability to produce ever higher densities of circuit elements within integrated circuits, semiconductor-based computer technology and architecture have advanced to nearly the quantum mechanical limitations of such configurations. Soon, size and price will limit the advancement of future growth of high-performance computers. A major component that modulates these attributes of high-performance computers is the memory, particular the memory circuit density. Because of the huge data storage requirements of these instruments, a new, compact, low-cost, very high capacity, high-speed memory circuit configuration is needed. A more detailed discussion of the issues relating to downsizing of electronic devices can be found in U.S. Patents 6,259,277, 6,219,833, 5,589,692, and 5,475,341, each of which is incorporated herein by reference. Molecular scale electronics is a field of study that proposes the use of single molecules or groups of molecules to function as the key components in future computational devices. In particular, molecules that have strategically placed charge barriers could serve as switches. In addition to substantial size reductions, the response times of molecular devices can be in the range of femto-seconds, while the fastest present devices operate in the nanosecond regime. Thus a 10 5 to 10 6 increase in speed may be attainable, particularly if other circuit elements do not limit operational performance. Optimizing the size of conventional basic units (usually the transistors) and their speed (limited by their natural temporal responses) are conflicting design goals. Therefore several trade-offs have to be made. The most important compromise in computational technology is the hardware-software duality, which materializes in the requirements of a programmed logic (memory- or software-dominant) versus wired logic (CPU-, or hardware-dominant). Components of programmed logic are smaller and able to handle larger problems than a wired logic system; however, a wired-logic is faster than a programmed-logic. At one extreme there can be a bit adder (a minimum logic unit able to sum) with a small number of logical gates that will require a large memory to obtain the results, while at the other extreme, there could be a large CPU with all specific functions wired into the system that will be able to process the entire problem, having only a small memory for the input and output data. Present technology is heavily inclined toward programmed logic, for example, a computer with a large memory and a fast but simple CPU. An ongoing challenge in implementing molecular scale electronics has been the search for approaches for arranging molecular components into structures that have logic functions. Thus, there have been investigations into architectures that allow molecular components to be used as the basic switching elements in building logic devices. Any logic gate may be constructed from a complete set of one or more fundamental gates. More than one of these fundamental gates may be arranged in series or in parallel, or a combination of the two, to form other logic functions. Thus, there has been particular emphasis on demonstrating the functionality of fundamental gates. A NAND gate is one fundamental gates that by itself forms a complete set. A NOR gate is another fundamental gate that by itself forms a complete set. Other complete sets include the combination of an AND gate and an XOR gate, the combination of an OR gate and an XOR gate, the combinatation of an AND gate and a NOT (also termed Inverter) gate, and the combination of an OR gate and a NOT gate. In one approach, elementary logic functions have been proposed using single molecules built up of smaller molecules bonded together. Each smaller molecule would be designed to mimic the function of a conventional circuit element. Such speculative molecules are shown in Figures 12, 13, and 14 of Proceedings of the IEEE, March 2000, pages 386-426, by James C. Ellenbogen and J. Christopher Love. This article is hereby incorporated by reference. The molecules shown in Figures 12, 13, and 14 of that reference are suggested as functioning as an AND gate, an OR gate, and a half adder, respectively. A disadvantage of this approach is the difficulty of synthesis of such proposed molecules. Further, dynamic conformational changes of the molecular segments would have the tendency to produce shorts between molecular segments. In another approach, elementary logic functions have been demonstrated in mixed arrays of conventional circuit components and switches that contain a monolayer of millions of molecular diodes between leads. Switching function has been demonstrated in devices of monolayers of molecular diodes oriented between two conventional metal plates, such as capacitor plates. A monolayer is a layer of molecules having the thickness of one molecule. In the monolayer, molecules having opposite ends with functional groups that allow bonding to metal and have come to be termed molecular alligator clips are oriented side by side. The functionalized ends are bonded to the metallic plates. Exemplary circuits incorporating molecular monolayer-based switching devices that are disclosed to have NAND and NOR functionality are shown in Figure 5 of the article entitled "Moletronics: A circuit design perspective", by David P. Nackashi and Paul D. Franzon, Proc, SPIE 2001, vol. 4236 pp. 80- 88. This article is hereby incorporated by reference in its entirety. Further, circuits incorporating oriented molecular monolayers are also described in U.S. Patent Application Attorney Docket Number OCR 1049, filed April 18, 2000, entitled "Molecular Scale Electronic Devices", which is incorporated herein by reference. In each of the above approaches, the molecular scale devices are implementations of wired logic. This runs counter to the trend in present technology toward programmed logic. Further, wired logic tends to be less tolerant of defects than programmed logic. For industrial scale fabrication of molecular scale devices to be cost-effective and efficient the devices must be tolerant to the defects that may occur in the course of chemically assembling the devices. Molecular scale electronics offers the possibility of computing power that dwarfs our current capabilities. Hence, a technique for creating programmed logic from molecular components in an effective, robust, and reproducible manner is desired. SUMMARY OF THE INVENTION In a preferred embodiment, the present invention features a programmed logic using molecular components. Alternatively, the present invention provides a programmed memory using molecular components. The molecular components are arranged in a nanocell that forms a small programmable unit. A nanocell preferably contains as many as trillions of molecules, a few thousand of which are in a suitable orientation for switching. This provides a balance in scale between the desire for miniaturization realized by single molecule logic and the desire for robust, programmable functionality. The nanocells of the present invention have the advantage that a single nanocell that is assembled by straightforward wet chemical techniques may be programmed first to perform as one logic unit and then optionally reprogrammed to function as another logic unit. Further, the nanocells are adapted to be incorporated into standard computers in the place of conventional logic units, while providing similar functionality on a smaller scale than presently realizable in conventional silicon-based logic. The versatility, robustness, and ease of production of the present nanocells are realized by constructing the nanocell from molecular components that are allowed to self-assemble into a structure. Unless guided by a scaffold, the molecular components assemble into a random arrangement, such as a random network. Since the network preferably extends on a scale from about 1 nm to about 2 μm, it is termed herein a nano-network. The random arrangement has the advantage that if a particular molecular component is absent from a particular location, this has little or no effect on the function of the nanocell. That is, the nanocell is programmable regardless of the precise arrangement of the molecular components. The nanocell is programmable by an iterative method termed a self-adaptive algorithm in which the algorithm adjusts to the arrangement of the molecular components. Thus, the present invention comprises a combination of features and advantages that enable it to overcome various problems of prior devices. The various characteristics described above, as well as other features, will be readily apparent to those skilled in the art upon reading the following detailed description of the preferred embodiments of the invention, and by referring to the accompanying drawings. BRIEF DESCRIPTION OF THE DRAWINGS For a more detailed description of the preferred embodiment of the present invention, reference will now be made to the accompanying drawings, wherein: Figure 1 is a schematic drawing of a nanocell according to an embodiment of the present invention; Figures 2A and 2B are a schematic drawings of arrangement of leads according to an embodiment of the present invention; Figure 3 is a schematic representation of molecular components according to an embodiment of the present invention; Figures 4A and 4B shows plots of the I(V) response of the molecules depicted in Figure 3; Figure 5 is a schematic drawing of a molecular computer according to an exemplary embodiment of the present invention; Figure 6 is a schematic representation of molecular devices containing pyridyl groups as "alligator clips"; Figure 7 is a schematic representation of a simulated nanocell according to an exemplary embodiment of the present invention, showing "on" high conducting molecules as black lines and "off" low conducting molecules as white lines; Figure 8 is schematic representation of the simulated nanocell of Figure 7 programmed to function as an Inverter gate; Figure 9 is schematic representation of the simulated nanocell of Figure 7 reprogrammed to function as a NAND gate; and Figure 10 is schematic representation of the simulated nanocell of Figure 7 reprogrammed to function as an Inverse Half Adder gate. DETAILED DESCRIPTION OF THE PREFERRED EMBODIMENT Nanocell Referring initially to Figure 1, a molecular electronic device 10 includes a nanocell 12. Nanocell 12 includes at least one and preferably a plurality of molecular circuit components 14. Nanocell 12 preferably has a linear dimension 16 of up to about 2 μm, more preferably between about 1 nm and about 2 μm. Linear dimension 16 may be the length of a side 18 of nanocell 12. Sides 18 enclose, that is define the borders containing, molecular circuit components 14. Nanocell 12 may include any number of sides and may be from one to three dimensional. Nanocell 12 is shown in Figure 1 in a square configuration. It will be understood that alternative configurations are contemplated, such as circular, rectangular, and any other suitable configuration. Still referring to Figure 1, nanocell 12 preferably further includes at least one input lead 20 and at least one output lead 22. The numbers of input leads and of output leads are not crucial. The number of leads preferably is constrained only by the technique for forming leads 20, 22, such as conventional lithography, and by the size of nanocell 20. Leads 20,22 are shown at the edges of nanocell 12 in Figure 1. It will be understood that other configurations of leads are contemplated. For example input leads 23 and output leads 25 may be interleaved, extending from edges of nanocell 27, such as shown in Figure 2A. Alternatively, input leads 29 and output leads 33 may extend from concentric perimeters 37 defining the edges of nanocell 39, as shown in Figure 2B. Nano-network 20 preferably spans each input lead 20 and each output lead 22. Leads 20, 22 may be metallic and are designed to connect to conventional lithographic interconnect, such as metallic wire. Edge molecular circuit components 24 are connect to leads 20, 22, through molecular alligator clips 26. Molecular alligator clips include sticky end groups that bind to metal, based on moieties such as sulfur, oxygen, selenium, phosphorous, isonitrile, pyridine, and carboxylate. A particularly preferred sulfur-based molecular alligator clip is a thiol group. It will be understood that molecular circuit components 14 may include two, three, four, five, six or more termini, such as disclosed in Tour, J. M.; Kozaki, M.; and Seminario, J. M. "Molecular Scale Electronics: A Synthetic/Computational Approach to Digital Computing," J. Am. Chem. Soc. 120, 8486-8493 (1998), which is incorporated by reference herein, and in U.S. Patent No. 6,259,277, hereby incorporated herein by reference. Each terminus is preferably an end that includes a molecular alligator clip. Still referring to Figure 1, nanocell 12 is preferably a nano-network 28 that has a network structure in which the molecular circuit components form at least a portion or portions of the network. Nano-network 28 is a preferably a random nano-network. In particular, nano- network 28 preferably has at least one of the following elements of randomness. The x-ray crystal structure of nano-network 28 may include no appreciable peaks indicative of a periodic or a semi-periodic arrangement of molecular circuit components, preferable for length scales between about 1 nm and 2 μm. Alternatively, the x-ray crystal structure of nano-network 28 may include at least one peak indicative of a lack of characteristic length scale between about 1 nm and 2 μm. Still alternatively, nano-network 28 may have a structure that exhibits scaling behavior, multi-scaling behavior, fractal characteristics, and the like. Yet alternatively, nano- network 28 may have a structure that includes orientations of molecular circuit components 14 with respect to an arbitrary axis that follow a known random distribution, such as a Poisson distribution of several molecules between nanoparticle in the network. Still yet alternatively, nano-network 28 may have a structure that includes positions of the centers of mass of molecular circuit components 14 that follow a known random distribution, such as is characteristic of non-crystalline or amorphous solids. It will be understood that the term "random" as used herein may include any other conventional definition and may be used interchangeably with the terms "disordered" and "irregular." Further, it will be understood that randomness may occur for certain predetermined length scales. In particular, the term random network here includes a network with little long-range order. Long-range may denote distances long with respect to the length scale of the components maldng up a network. A random arrangement of molecular circuit components 14 in molecular electronic device 10 has the advantage that device 10 may be fault tolerant. Still referring to Figure 1, in one preferred embodiment, nano-network 28 is self- assembled. As is known in the art, a self-assembled network is one that has created itself from its component parts in response to a stimulus, such as a change in reaction conditions. A self- assembled nano-network preferably has a non-predetermined structure. Further, a self- assembled nano-network in this embodiment preferably has only short range order between adjacent nanoparticles and preferably is disordered for longer length scales. Nano-networks suitable for use in the present invention include but are not limited to nano-networks made as in the following description. Metal nanoparticles are deposited on an oxide grid. The oxide grid may be a semiconductor substrate from which material has been removed to define a hole that provides the boundaries of the nano-network. A molecular self- assembled monolayer coating each nanoparticle may be used to control the spacing between nanoparticles. Molecular switches are inserted into the inert self-assembled monolayer barrier around each nanoparticle via processes that have previously been demonstrated, and thereby inter-link adjacent nanoparticles. The processes have been disclosed in Dunbar, T. D.; Cygan, M. T.; Bumm, L. A.; McCarty, G. S.; Burgin, T. P.; Reinerth, W. A.; Jones, JJ, L.; Jackiw, J. J.; Tour, J. M; Weiss, P. S.; Mara, D. L. J. Phys. Chem. B. 2000, 104, 4880-4893, hereby incorporated herein by reference. Still referring to Figure 1, nano-networks 28 that are trainable and include any suitable conventional molecular circuit components are contemplated. Thus, molecular circuit components 14 may be selected from among molecular wires, molecular rectifiers, molecular diodes, molecular switches, molecular resistors, molecular transistors, and the like and combinations thereof. A molecular wire, rectifier, diode, switch, resistor, or transistor is any molecule that can function in a circuit analogously to a conventional wire, rectifier, diode, switch, resistor, or transistor, respectively. Exemplary molecular wires include oligo(phenyleneethynylene), and the like. Exemplary molecular rectifiers include hexadeculquinolinium tricyanoquinodimethanide, and the like. Still referring to Figure 1, molecular circuit elements 14 preferably include conjugated molecular segments. The conjugated molecular segments are preferably substituted with groups at the termini that function as molecular alligator clips. Exemplary conjugated molecules that serve as conjugated molecular segments for molecular circuit elements, and exemplary conjugated molecules functionalized with molecular alligator clips are described in: Tour, J. M. "Molecular Electronics. Synthesis and Testing of Components," Accounts of Chemical Research, volume 33, number 11, pages 791-804 (2000); Tour, J. M.; Kozaki, M.; and Seminario, J. M. "Molecular Scale Electronics: A Synthetic/Computational Approach to Digital Computing," J. Am. Chem. Soc. 120, 8486-8493 (1998); Dirk, S. M., et al. "Accoutrements of a molecular computer: switches, memory components and alligator clips," Tetrahedron 57, pp. 5109-5121 (2001), each hereby incorporated herein by reference. Further, molecular circuit components 14 may include any of the molecules, conductive organic material, or conductive paths disclosed in U.S. Patent Application Serial Number Attorney Docket Number OCR 1049, filed April 18, 2000, entitled "Molecular Scale Electronic Devices", which is incorporated by reference herein. Molecular circuit element 14 is preferably a molecule that exhibits negative differential resistance. Conventional resonant tunneling diodes also exhibit negative differential resistance. However, conventional resonant tunneling diodes are based on gallium arsenide. Negative differential resistance is a particular useful property in designing logic as it allows negation. Referring now to Figure 3, a molecular circuit component 14 may be a molecular diode 30. Exemplary molecular diodes include a mono-nitro substituted oligophenylene 32, in particular 4,4'-diphenyleneethynelene-2 -nitro-l-benzenethiol and a di-nitro substituted oligophenylene 34, in particular 2',5 -dinintro-4,4'-diphenyleneethynylene-l-benzenethiol. Alternative molecular diodes include the dithiol substituted analogs of molecules 32 and 34, in particular 4,4-diphenyleneethynelene-2-nitro-l,4"-benzenedithiol and 2',5'-dinitro-4,4- diphenyleneethynylene-l,4"-benzenedithiol, respectively. Each of these molecules includes a thiol group at each end. Such a configuration is preferred for molecular circuit elements 14 that contact gold at each end. As used herein the term molecular switch also encompasses these molecules when they are in an electrical environment that allows them to function as a switch. The electrical environment may be created by adding or changing substituents, by bonding another molecule to the molecular diode, or by connecting the molecular diode, such as by a molecular alligator clip, to a circuit element. Nanocell 12 may further include nanoscale components 40. Nanoscale components 40 preferably are arrayed as part of nano-network 28. Nanoscale components may have functionality of electrical connectors, aiding the formation of molecular components 14 into a conductive network. Further, nanoscale components may have functionality of electronic circuit components, such as conductance, capacitance, resistance, impedance, and the like. Exemplary nanoscale components include nanotubes;, nanoparticles, nanorods, and combinations thereof. Nanoparticles may be metallic, semiconducting, dielectric, and the like. Exemplary nanoparticles and nanotubes are described in Reed, M.A. and Tour, J.M. Scientific American 282, pp. 86-93 (2000), hereby incorporated herein by reference. Exemplary nanorods are described in Martin, B.R., et al. "Orthogonal self-assemble on colliodal gold-platinum nanorods," Adv. Mater. 11, pp. 1021-1025 (1999), hereby incorporated herein by reference. It will be understood that where one molecular circuit component 14 is depicted by a line in Figure 1, a plurality of molecular circuit components 14 may be substituted. For example, a plurality of molecular circuit components 14 may contact each of a pair of nanoscale components 40, spanning the nanoscale components. Referring still to Figure 1, in an exemplary arrangement, a nanocell 10 includes molecular switches 52 and nanoparticles 54. Nanoparticles 54 are preferably metallic, more preferably gold. Molecular switches 52 are preferably switches with thiol molecular alligator clips at each end, more preferably 2',5'-dinitiO-4,4 -diphenyleneethynylene-l,4"-benzenedithiol. Edge molecular switches 56 connect to input leads 20 and output leads 22. Molecular switches 52 interconnect nanoparticles 54. Interconnect is here used in the sense of enabling electrical continuity. In this sense, in an alternative view, nanoparticles 54 interconnect molecular switches 52. Further, the electrical continuity supplied by a molecular switch 52 need not be permanent and can be interrupted by configuring molecular switch 54. Nano-network 28 is preferably formed by molecular switches 52 and nanoparticles 54. In particular, nanoparticles 54 are preferably arrayed with little or no order. Further, molecular switches 52 interconnect nanoparticles 54. Not all nanoparticles 54 connect to other nanoparticles 54 and some nanoparticles 54 are connected to more than one or more than two other nanoparticles, and connections may be randomly distributed. It will be understood that the impedance properties of a nanocell 12 may be optimized by varying any one or combination of a metal of nanoparticles 54, a conjugated backbone of molecular circuit component 14, the moiety for the alligator clip of molecular circuit component 14, the geometry of leads 20, 22, and other suitable properties for adjusting impedance. It will further be understood that molecular circuit components 14 may be multiple state molecules, such as three, four, five, or six state molecules. For example, C 60 has six independent states that are attained by incrementally taking up six electrons. Thus, molecular circuit components 14 are not limited to binary "0" and "1", or "on" and "off" logic and, for example, tertiary and quaternary logic are contemplated. Referring now to Figure 5, a plurality of programmable electronic devices 62, preferably nanocells 64, may be interconnected by standard lithographically produced metallic wires to form a molecular computer 66. Nanocells 64 are preferably constructed as described above with respect to Figure 1, more preferably as shown, for example, in Figure 4. Any conventional architecture for interconnection by wires 65 is contemplated. Programmability Referring again to Figure 1, molecular electronic device 10 is preferably programmable. More particularly, molecular electronic device 10 is preferably programmable with a self- adaptive algorithm. As used herein, a self-adaptive algorithm is one that can "evolve" using an iterative process in which the algorithm queries and adjusts a system in order to move the system toward a desired state. More particularly, self-adaptive algorithms are a class of algorithms that include a set of rules for comparing an actual outcome of a system to a target outcome, and adjusting an input to the system based on a function of the difference between the actual outcome and the target outcome. A next actual outcome is associated with the adjusted input according to the behavior of the system. By repeatedly adjusting the inputs, the actual outcome converges to the target outcome. In this way, the self-adaptive algorithm trains the system. Molecular device 10 is preferably programmable by a self-adaptive algorithm for configuring molecular circuit components 14. In one preferred embodiment, molecular circuit components 14 are preferably configurable by applying a voltage across leads 20, 22. For example, molecular circuit components 14 may include molecules for which a conductivity-affecting property is adjustable by applying a voltage across leads 20, 22. The conductivity-affecting property that is adjusted is preferably selected from the group consisting of: charge, conformational state, electronic state, and the like, and combinations thereof. It will be understood that molecular circuit components 14 may be configurable by other methods Oligophenylene-based molecular wires and switches are exemplary of molecules whose conductivity is affected by charge, electronic state, and conformational state. It is believed that applying a voltage across these molecules can effect transitions between electronic states. The voltages may cause the molecule to hold an electron; thus increasing its charge. Further, when charged, the molecule transitions to an excited electronic state. The phenyl rings rotate with respect to each other so that electronic orbitals, such as pi-orbitals, align, forming a molecular orbital extending the length of the molecule. In the presence of an applied voltage, it is believed that electronic continuity is established through the molecular orbitals and the molecule conducts. A description of a molecular mechanism of switching functionality is contained Donhauser, Z.J. et al., Science 292, pp. 2303-2307 (2001), hereby incorporated herein by reference. In a preferred arrangement, the electrical characteristics of the materials used to make the leads contacting the molecule are matched to the energetics of the molecular electronic transitions. In particular, it is preferred that the Fermi energy of the metal contacting a conjugated molecular circuit element are close in energy to the lowest unoccupied molecular orbital (LUMO) energy of the molecular circuit element. This has the advantage of optimizing the impedance characteristics of the connection between the metal and the molecule. Operation of molecular switches differs from molecular wires. The conductivity of switches can be switched to a state that is stable for a relatively long time by applying and then removing a voltage. Referring to Figure 3, stability times of at least 24 hours have been obtained with molecule 34. Further, it is expected that improved sealing of the system containing a molecular switch; use of similar oligophenylene-based molecules with multiple nitro groups; or use of new classes of molecules will permit longer stability times, such as days or months. A preferred molecular switch is configurable by applying a switching voltage and operates in either a high or low conductivity state by applying an operating voltage that is less than the switching voltage. Referring now to Figure 3, operation of a molecular switch is exemplified by operation of a molecule 34. When a switching voltage above 2.0V is applied to molecules 34, molecules 34 switch to the high conductivity state and when a corresponding voltage below -2.0V is applied the molecules 34 will switch to a low conductivity state. The switching voltage is preferably between about 0.2 and 3.0V for the high state and -0.2 and -3.0V for the low conductivity state. The high conductivity state is associated with the I(V) curve that is traced by black dots and the low conductivity state is associated with the lower I(V) curve, traced by white dots, in Figure 4. The degree of differentiation between the high and low conductivity states is determined by the difference between these two curves. When an operating voltage between about -2 V and 2V is applied to molecules 36 they conduct according to the state, high or low conductivity, that they were most recently switched to. A molecule in the high conductivity state will also exhibit low conductivity if a voltage exceeding the negative differential resistance (NDR) limit is applied. The degree of differentiation between high and low conductivity of a molecule in the high conductivity state that is due to the NDR effect is determined by the ratio between the peak and valley on the I(V) curve traced by the black dots. The absolute value of the operating voltage is preferably between about 0.2 and about 2.0V. Referring again to Figure 1, nanocell 12 is preferably programmable by an algorithm for setting molecular switches 54. Molecular switches 54 are preferably settable by applying a voltage across leads 20, 22. It is preferred that a self-adaptive algorithm for programming nanocell 10 be capable of learning voltage combinations that can be applied to leads 20, 22 that will configure remote molecular switches, that is molecular switches not directly connected to leads 20, 22. It will be understood that the type of the self-adaptive algorithm is not critical. Any suitable conventional self-adaptive algorithm capable of training a network such as nano- network 28 may be used. Exemplary self-adaptive algorithms include genetic algorithms, simulated annealing algorithms, reinforcment learning algorithms, temperoral difference algorithms, go with the winner algorithms, and the like. The principles of self-adaptive algorithms are described in Goldberg, D.E., Genetic algorithms in Search, Optimization, and Machine Learning, (Addison Wesley, Reading, MA, 1989), pp. 1-15 and 221-229, hereby incorporated herein by reference. Self-adaptive algorithms have the advantage of being error-resilient. Further, the use of a self-adaptive algorithm also provides the advantage of fault tolerance. Thus, molecular electronic device 10 is adapted to be manufactured by methods of self-assembly that can be implemented on an industrial scale with cost-effective reliability. The self-adaptive algorithm may be encoded in an auxiliary computer. An advantage of the present invention is that the programmability of molecular electronic device 10 means that the device, as first assembled, need not function as a specified logic device. Thus, molecular electronic device 10, nanocell 12, and nano-network 28 need not have a predetermined structure. Nanocell 12, and in particular nano-network 28 may be self- assembled into an indeterminate structure that may be random. A self-adaptive algorithm may be used to program device 10 to function as a desired device. In a preferred embodiment, device 10 is programmable to function as a logic unit selected from the group consisting of AND, OR, XOR, NOR, NOT, and NAND gates and the like. Thus, in this embodiment, when device 10 has been programmed, it is a programmed logic device with the logic element being selected from the group consisting of AND, OR, XOR, NOR, NOT, NAND, and the like. In another preferred embodiment, device 10 is programmable to function as a logic unit selected from the group consisting of an Adder, a Half- Adder, a Multiplexor, a Decoder, or and the like. Thus, in this embodiment, when device 10 has been programmed, it is a programmed logic device with the logic element being selected from the group consisting of an Adder, a Half-adder, a Multiplexor, a Decoder, and the like. In yet another preferred embodiment, device 10 is programmable to function as a memory unit. It will be understood that device 10 preferably may function as any gate having a truth table supported by input/output pins. Device 10 is preferably reprogrammable. In particular, device 10, initially programmed to function as one of the above-described logic or memory units can be reprogrammed to function as another of the above-described logic or memory devices. Thus, device 10 has the advantage of versatility. The above-described programmability preferably is achieved by using the preferred topologies of nanocell structures described above in combination with the preferred programming methods described below. Programming method A preferred method of maldng an electronic component includes providing a self- assembled nanocell and programming the nanocell to function as the electronic component. The nanocell is preferably a nanocell according to any of the embodiments described above. Programming the nanocell preferably includes configuring the molecular circuit components. Configuring the molecular circuit components preferably includes adjusting a conductivity-affecting property of at least one of the molecular circuit components by applying a voltage across the input lead and the output lead. The conductivity-affecting property may be selected from among any of the above-described conductivity-affecting properties. Programming the nanocell preferably further includes testing the performance of the nanocell. For example, the performance may be tested by comparing input/output operating voltage relationships of the nanocell to a target truth table, such as a desired logic truth table. Programming the nanocell preferably still further includes repeating the steps of configuring the molecular circuit components and testing the performance of the nanocell until the nanocell functions as the electronic component desired. For example, the steps may be repeated until the input/output operating voltage relationships match, within a desired predetermined error, the above-described target truth table. Once programmed, the electronic component serves as any of the above-described logic or memory units or other similar device. Providing a self-assembled nanocell preferably includes allowing a plurality of nanoscale components to self-assemble into a random array, allowing the plurality of molecular circuit components to self-assemble into an interconnected network between the nanoscale components, and bonding the molecular circuit components to the nanoscale components with molecular alligator clips. The random array may be an array with short-range order and long- range disorder. The molecular alligator clips may include any of the above-described moieties useful as molecular alligator clips. A preferred moiety is a thiol group. The nanoscale components may be, for example, any of the above-described nanoscale components. The molecular circuit components may be, for example, any of the above-described molecular circuit components. Any embodiment described above for programming or training a nanocell can be used to assemble a computer from a plurality of nanocells. One method of making a computer preferably includes providing a plurality of trained self-assembled nanocells, interconnecting the trained nanocells to a plurality of untrained nanocells, and allowing the trained nanocells to train the untrained nanocells. An advantage of the above method is that the trained nanocell is used in the bootstrap training of the untrained nanocell. Thus, the method may include hierarchically repeating interconnecting the nanocells and using the latest trained nanocells to train the untrained nanocells. In this way, a molecular computer may be rapidly and efficiently made from a plurality of nanocells. EXAMPLES EXAMPLE 1 Synthesis of conjugated molecules Switches and Memory Components In an effort to improve the electron storage time by adding more nitro groups, synthetic targets 1 and 2 were chosen. The SAc group is easily cleaved to the free thiol (SH) upon treatment with acid or base. The synthesis of compound 1 is outlined in scheme 1. 1 2 The synthesis of 1 began by Sonogashira coupling 2,5-dibromo-4-nitroaniline (3) to phenylacetylene affording 4 which was subjected to an HOF oxidation forming 5. A final coupling produced desired compound 1 in 24% yield. The low yield in this coupling may be indicative of the easily deprotected thiol or a stable palladacycle intermediate that formed during coupling. Scheme 1 In order to conduct electrons all the phenyl rings in the conjugated molecule should be preferentially planar to each other. If a phenyl group replaces the terminal phenylethynyl group, the system cannot attain planarity. In an effort to determine the effect of a rotational barrier (i.e. conduction barrier), the synthesis of compound 2 was initiated via a Suzuld coupling of 2,5-dibromo-4-nitroacetanilide (6) to phenyl boronic acid to form compound 7. The acetyl group was removed to provide the aniline (8) functionality that would subsequently undergo an HOF oxidation to afford 9 in nearly quantitative yield. A final Sonogashira coupling provided 2. Scheme 2 AcS- Scheme 3 12 13 13 was synthesized for the purpose of studying the electrochemical properties of the quinone-containing molecular system. Scheme 3 shows the synthesis of 13 from 1,4- dimethoxybenzene (10). 10 was converted to 11 using bromine and glacial acetic acid in good yield. Compound 11 was then cross-coupled with an excess of phenylacetylene to afford compound 12 which was then oxidized to the quinone affording desired compound 13. This synthetic route had to be used because quinones generally cannot be used in the palladium- catalyzed couplings since quinones are known to oxidize palladium(O) to palladium(II), terminating the catalytic cycle. Ceric ammonium nitrate (CAN) is a mild and neutral oxidizing agent known to generate quinones from dimethoxybenzenes and therefore was a logical choice for this procedure. 18 This oxidation afforded the desired quinone compound in 47 % yield. The optimum conditions for the oxidation have not yet been obtained for these systems. Scheme 4 17 Scheme 4 shows the synthesis of the quinone-containing molecular system with one thioacetate group serving as a protected alligator clip. Cross-coupling of 11 with phenylacetylene afforded 14 in a modest yet statistically expected yield of 33% due to the equal reactivity of both aryl bromides of 11 under Sonogashira coupling conditions. 15 was prepared by the cross-coupling of trimethylsilylacetylene with 14 followed by deprotection of the alkyne to afford 15. Further palladium-catalyzed cross-coupling with 4-iodobenzenethioacetate afforded compound 16. The final compound 17 was obtained in 74% yield via the CAN oxidation. However, this yield was an isolated incident. Other attempts resulted in much lower yields (~ 20 %). More work is underway to optimize the conditions of this CAN oxidation. Scheme 5 20 Scheme 5 shows the synthesis of the quinone-containing molecular system with alligator clips on both ends (5). This compound can be used to crosslink metallic nanoparticles for bridging connections in future molecular electronic devices. 11 was cross-coupled with an excess of trimethylsilylacetylene followed by a subsequent deprotection to cleanly afforded the diyne 18. This was subsequently cross-coupled with 2 equivalents of 4-iodobenzenethioacetate to afford compound 19. Finally, 19 was oxidized using the CAN procedure to generate 20 in modest yield. ALLIGATOR CLIPS The synthesis of several compounds containing a pyridine alligator clip for incorporation into a molecular electronic device began with compound 21. The synthesis of 22 was accomplished by coupling pyridine 21 with 2,5-dibromonitrobenzene as shown in eq 1. The low yield may be due to a stable copper acetylide formed after the TMS group is cleaved. If an in situ deprotection was not used, the pyridine alkyne proved to be unstable. 24 was synthesized according to Scheme 6. The synthesis began by coupling one equivalent of 21 to 2,5-dibromonitrobenzene selectively to the position ortho to the nitro group affording 23. Coupling 23 to phenylacetylene to produce 24 completed the synthesis. Scheme 6 B 23 2 4 The synthesis of compound 26 was initiated to study the effect of the nitro group in relation to the chemisorbed pyridine alligator clip. To this end, compound 24 was synthesized in a manor analogous to the synthesis of 23 as shown in Scheme 7. Coupling one equivalent of phenylacetylene selectively to 2,5-dibromonitrobenzene to produce 25 then coupling to 21 to afford 26 in good yield completed the synthesis. Scheme 7 26 Linker 28 was synthesized according to Scheme 8. The synthesis commenced with the coupling of 2,5-dibromo-4-nitroacetanilide with excess trimethylsilylacetylene to give 27, which was then deprotected in-situ and coupled with 4-iodopyridine to produce 28 in poor yield. The low yield of the coupling reactions could be due to a cyclization process between the nitro and the alkyne unit. Scheme 8 Compound 31 was synthesized in an effort to form a SAM via the protected benzenethiol terminal group enabling the pyridyl end of the molecule to serve as a better top contact with metal than a phenyl when incorporated into a device. 31 was synthesized by coupling the 2,5-dibromo-4-nitroacetanilide with 21 in a low yield to afford compound 29. 29 was then coupled with trimethylsilylacetylene, followed by deprotection with potassium carbonate to yield 30. finally, 30 was coupled with 4-iodobenzenethioacetate, which afforded the molecular device 31 in good yield (75 %). Scheme 9 l 30 31 32 was synthesized to study the effect of a rotational barrier analogous to that described for 2. The synthesis of 32 began with previously synthesized 7 and coupling to 21 in good yield as shown in eq 2. Compound 34 was synthesized according to eq 3 using the previously described 33. Compound 34 is analogous to a thiol terminated nitroaniline that previously exhibited negative differential resistance (NDR) in a device embodiment. 33 In addition to the pyridine containing systems, three potential memory and switching components terminated by diazonium salts were synthesized. 38 is analogous to the thioacetyl terminated NDR and memory component 1 and the pyridyl terminated 24. The synthesis of 38 began by coupling 35 7 to 2,5-dibromonitrobenzene in moderate yield to afford 36 which was then coupled to phenylacetylene to produce compound 37. Diazotization of 37 produced the completed molecule 38 in good yield. Scheme 10 40 is similar in structure to 26 except the pyridyl group has been replaced with the aryl diazonium salt. The synthesis of 40 is shown is Scheme 11. Coupling aniline 35 to nitrocompound 25 produced diazonium precursor 39 in moderate yield. Diazotization of aniline 42 afforded desired product 37. Scheme 11 25 35 77% 39 0 2 N ^ ^ ≡ - , ._ ^- J ~ N2 BF4 40 Nanoparticle linker 43 was synthesized according to Scheme 12. Starting from dinitro 41 and coupling aniline 35 afforded dinitrodianiline 42 which was subsequently diazotized to produce 43 in good yield. Scheme 12 3 Experimental General Procedure. All reactions were carried out under a dry nitrogen atmosphere unless noted. Reagent grade diethyl ether, and tetrahydrofuran (THF) were distilled under nitrogen from sodium benzophenone ketyl. Reagent grade dichloromethane (CH 2 C1 2 ) was distilled from calcium hydride (CaH 2 ) under nitrogen. Triethylamine and NN- diisopropylamine (Htinig's base) were distilled over CaH under a nitrogen atmosphere. Bulk hexanes were distilled prior to use. Gravity column chromatography and flash chromatography were carried out using 230-400 mesh silica gel from EM Science. Thin layer chromatography (TLC) was performed using Merck 40 F 254 on a thickness of 0.25 mm. General Pd/Cu Coupling Reaction Procedures. To an oven dried glass screw capped tube were added all solids including the aryl halide (bromide or iodide), alkyne, copper iodide, triphenylphosphine and palladium catalyst. The atmosphere was removed via vacuum and replaced with dry nitrogen (3x). THF, remaining liquids, and Htinig's base or triethylamine were added and the reaction was heated in an oil bath while stirring. Upon cooling the reaction mixture was filtered via gravity filtration to remove solids and diluted with CH 2 C1 . The reaction mixture was extracted with an aqueous solution of ammonium chloride (NH t Cl) (3x). The organic layer was dried with magnesium sulfate and filtered. The solvent was then removed in vacuo. General Procedure for the Deprotection of Trimethylsilyl-Protected Alkynes. To a round bottom flask equipped with a stir bar were added the protected alkyne, potassium carbonate (5 equiv per protected alkyne), methanol, and methylene chloride. The reaction was heated, and upon completion the reaction mixture was diluted with methylene chloride and washed with brine (3x). The organic layer was dried over MgSO , and the solvent removed in vacuo. General HOF Oxidation Procedure. To a 125 mL polyethylene bottle were added H 2 O (2 mL) and CH 3 CN (60 mL) and cooled to -20 °C. F 2 (20% in He) was then bubbled through the solution at a rate of 50 seem for 2 h. The resulting HOF/CH 3 CN solution was purged with He for 15 min. The species to be oxidized was added in acetone or ethyl acetate (10 mL) and mixed at -20 °C for 5 min before being neutralized by pouring into a saturated NaHCO 3 solution. The organic phase was then separated, dried over MgSO and the solvent were removed in vacuo. General Procedure for the Diazotization of Anilines with Nitrosonium Tetrafluoroborate in the Acetonitrile - Sulfolane System. NOBF 4 was weighed out in a nitrogen filled dry box and placed in a round bottom flask equipped with a magnetic stirring bar and sealed with a septum. Acetonitrile and sulfolane were injected in a 5 to 1 volume ratio and the resulting suspension was cooled in a dry ice/acetone bath to - 40 °C. The solution of the aniline was prepared by adding warm sulfolane (45-50 °C) to the amine under a nitrogen blanket, sonication for 1 min and subsequent addition of acetonitrile (10-20% by volume). The aniline solution was then added to the nitrosonium salt suspension over a period of 10 min. The reaction mixture was kept at - 40 °C for 30 min and was then allowed to warm to the room temperature. At this point, the diazonium salt was precipitated by the addition of ether or dichloromethane, collected by filtration, washed with ether or dichloromethane and dried. Additional purification of the salt was accomplished by re-precipitation from DMSO by dichloromethane and/or ether. 4-EthynlphenyI-2,4-dinitrobromobenzene (5). 2 ^ Bromo-4-nitro-5- ethynlphenylaniline (490 mg, 1.48 mmol) in ethyl acetate (10 mL) was oxidized according to the general HOF oxidation procedure to yield 320 mg (60 %) of a yellow solid. IR (KBr) 3442.7, 3101.4, 2216.8, 1610.6, 1540.9, 1461.3, 1384.8, 1358.7, 1337.1, 1264.4, 906.2, 849.6, 824.4, 760.2, 689.8 cm "1 . 1H NMR (400 MHz, CDC1 3 ) δ 8.41 (s, 1 H), 8.09 (s, 1 H), 7.60-7.58 (m, 2 H), 7.41-7.39 (m, 3 H). 13 C NMR (100 MHz, CDC1 3 ) δ 152.1, 150.4, 132.7, 131.7, 131.0, 130.7, 129.1, 121.5, 119.8, 113.9, 102.0. HRMS Calc'd for 345.9589. Found: 345.9585. 2',5'-Dinitro-4,4'-diethynylphenyl-l-thioacetylbenzene (1). 4 (300 mg, 0.86 mmol), 4-ethynyl(thioacetyl)benzene (183 mg, 1.04 mmol), bis(dibenzylideneacetone)palladium (12 mg, 0.02 mmol), copper(I) iodide (4 mg, 0.02 mmol), triphenylphosphine (13 mg, 0.05 mmol), Hunig's base (0.60 mL) and THF (20 mL) were reacted according to the general coupling procedure. The reaction mixture was heated at 60 °C overnight and worked up according to the procedure above. The crude compound was purified via flash chromatography (silica, 3:1 dichloromethane:hexane) to yield 90 mg (24%) of a bright yellow solid. IR (KBr) 2220.2 1705.2, 1545.5, 1499.81, 1396.8, 1337.5, 1286.1, 1252.1, 1108.6, 1087.2, 953.2, 926.0, 868.3, 827.2, 756.7, 684.1, 618.3 cm -1 . 1H NMR (400 MHz, CDC1 3 ) δ 8.34 (d, J = 0.4, 1 H), 8.35 (d, J = 0.4, 1 H), 7.63-7.59 (m, 4 H), 7.46-7.40 (m, 5 H), 2.49 (s, 3 H). 13 C NMR (100 MHz, CDC1 3 ) δ 193.2, 151.1, 134.7, 133.1, 132.7, 131.0, 130.7, 129.1, 122.8, 121.7, 119.4, 118.6, 102.4, 100.9, 84.8, 83.5, 30.8. HRMS Calc'd for 442.0623. Found: 442.0634. 2-Bromo-4-nitro-5-phenylacetanilide (7). 6 (676 mg, 2 mmol), triphenylphosphine (52 mg, 0.2 mmol), phenylboronic acid (293 mg, 2.4 mmol), bis(triphenylphosphine)palladium dichloride (70 mg, 0.1 mmol), and cesium carbonate (977 mg, 3 mmol) were placed in a 100 mL round bottom flask and the atmosphere was removed and replaced with nitrogen. Toluene (30 mL) was added and the reaction was heated at 60 °C for 2 d. The reaction was worked up by diluting with ether, washing with aqueous ammonium chloride (2x), drying over MgSO 4 , and removing the solvents in vacuo. The crude product was purified via flash chromatography (CH 2 C1 2 ) to yield 430 mg (64%) of a white solid. IR (KBr) 3373.6, 3322.4, 3086.5, 1774.0, 1681.7, 1568.9, 1528.8, 1445.8, 1389.4, 1358.6, 1245.8, 1179.1, 1112.5, 1056.1, 1030.4, 999.6, 872.0, 850.9, 768.9, 697.1 cm "1 . 1H NMR (400 MHz, CDC1 3 ) δ 8.54 (s, IH), 8.15 (s, IH), 7.80 (br s, IH), 7.40-7.38 (m, 3H), 7.29-7.27 (m, 2H) 2.26 (s, 3H). 13 C NMR (100 MHz, CDC1 3 ) δ 168.44, 143.77, 139.34, 137.74, 136.81, 128.67, 128.51, 128.47, 127.85, 123.31, 110.59, 25.05. HRMS Calc'd for C 14 H π BrN 2 O 3 : 333.9953. Found: 333.9952. 2-Bromo-4-nitro-5-phenylaniline (8). 7 (500 mg, 1.49 mmol), potassium carbonate (1.031 g, 7.46 mmol), methanol (30 mL), and methylene chloride (30 mL) were added to a 100 mL round bottom flask and stirred at room temperature under a nitrogen blanket for 2 h. The reaction was worked up by filtering off the K 2 CO 3 and washing with CH 2 C1 2 to yield 437 mg (100%) of the title compound. IR (KBr) 3463.7, 3349.2, 3221.3, 1623.9, 1584.6, 1555.4, 1495.5, 1443.6, 1406.9, 1305.6, 1259.4, 1123.9, 1051.7, 896.7, 846.5, 760.1, 701.3, 632.1, 563.8 cm 1 . 1H NMR (400 MHz, CDC1 3 ) δ 8.21 (s, IH), 7.39-7.36 (m, 3H), 7.23-7.21 (m (overlapping), 2H), 6.61 (s, IH). 13 C NMR (100 MHz, CDC1 3 ) δ 148.5, 139.4, 138.5, 130.7, 128.8, 128.4, 128.2, 128.1, 117.2, 106.3. HRMS Calc'd for 291.9848. Found: 291.9846. 2,5-Dinitro-4-phenylbromobenzene (9). 8 (373 mg, 1.28 mmol) in ethyl acetate (10 mL) was oxidized according to the general HOF oxidation procedure to yield 407 mg (99 %) of a orange solid IR (KBr) 3446.7, 3090.4, 1542.8, 1461.1, 1443.1, 1347.3, 1257.7, 1114.6, 1076.2, 1051.8, 1021.0, 904.5, 842.5, 768.8, 743.7, 699.9, 551.0, 485.16 cm "1 . 1H NMR (400 MHz, CDC1 3 ) δ 8.16 (s, 1 H), 7.89 (s, 1 H), 7.47-7.45 (m, 3 H), 7.31-7.29 (m, 2 H). 13 C NMR (100 MHz, CDC1 3 ) δ 151.5, 150.6, 137.2, 134.4, 130.8, 130.1, 129.7, 128.9, 128.1, 114.1. HRMS Calc'd for 321.9589. Found: 321.9592. 2',4'-Dinitro-5'-phenyl-4-ethynylphenyl-l-thioacetylbenzene (2). 9 (147 mg, 0.46 mmol), 4-ethynyl(thioacetyl)benzene (106 mg, 0.60 mmol), bis(dibenzylideneacetone)palladium (26 mg, 0.05 mmol), copper(I) iodide (9 mg, 0.05 mmol), triphenylphosphine (12 mg, 0.05 mmol), Hunig's base (0.16 mL) and THF (20 mL) were coupled according to the general coupling procedure. The reaction mixture was stirred and heated overnight at 45 °C. Crude product was purified via column chromatography (silica, 3:1 dichloromethane:hexanes) to yield 75 mg of an orange solid (39%). IR (KBr) 2922.7, 2214.3, 1702.7, 1542.8, 1488.1, 1357.1, 1271.1, 1115.1, 1088.6, 956.0, 908.6, 829.9, 770.5, 707.0, 623.4 cm "1 . 1H NMR (400 MHz, CDC1 3 ) δ 8.16 (s, 1 H), 8.10 (s, 1 H), 7.63 (d, J = 8.4, 2 H), 7.48-7.44 (m, 5 H), 7.36-7.33 (m, 2 H), 2.44 (s, 3 H). 13 C NMR (100 MHz, CDC1 3 ) δ 193.3, 151.2, 150.6, 136.8, 134.8, 134.7, 133.1, 130.8, 130.2, 130.1, 129.6, 128.6, 128.1, 122.9, 119.0, 99.8, 84.5, 30.8. HRMS Calc'd for 418.0623. Found: 418.0619. 2,5-Dibromo-l,4-dimethoxybenzene (11). In a 100 mL round bottom flask, 1,4- dimethoxybenzene (10.0 g, 72.4 mmol) was dissolved in glacial acetic acid (20 mL). A solution of bromine (7.42 mL, 145.0 mmol) in glacial acetic acid (7.5 mL) was added dropwise to the first solution at room temperature over 40 min. The resulting mixture was allowed to stir for 2 h. The crude product was washed with ice-cold water and ice-cold methanol to afford fine white crystals. The mother liquor was concentrated and cooled to afford more white crystals (15.9 g, 74% yield). Mp 136-138 °C (lit 21 p 144-145 °C). IR (KBr) 3091.9, 3022.1, 2968.8, 2944.4, 2842.8, 1694.9, 1494.2, 1475.6, 1436.5, 1358.2, 1275.0, 1211.8, 1185.0, 1065.4, 1021.9, 860.5, 760.4, 441.8 cm "1 . 1H NMR (400 MHz, CDC1 3 ) 07.13 (s, 2 H), 3.87 (s, 6 H). 13 C NMR (100 MHz, CDC1 3 ) δ 150.93, 117.53, 110.90, 57.43. 2,5-Di(ethynylphenyl)-l,4-dimethoxybenzene (12). 11 (8.745 g, 29.55 mmol), bis(triphenylphosphine)palladium dichloride (0.415 g, 0.591 mmol), copper(I) iodide (0.225 g, 1.182 mmol), triphenylphosphine (0.310 g, 1.182 mmol), THF (35 mL), Hunig's base (20.5 mL, 118 mmol), and phenylacetylene (7.8 mL, 70.92 mmol) were used following the general procedure for couplings. The solution was heated in a 65 °C oil bath for 3 d. Recrystallization from benzene afforded the desired product mp 175-177 °C (lit. 16 176-177 °C) (9.22 g, 92 %). 1H NMR (400 MHz, CDC1 3 ) δ 7.57 (m, 4 H), 7.34 (m, 6H), 7.03 (s, 2H), 3.89 (s, 6 H). 13 C NMR (100 MHz, CDC1 3 ) δ 154.10, 131.89, 128.60, 128.50, 123.39, 115.86, 113.57, 95.23, 85.86, 56.66. 2,5-Di(ethynylphenyl)benzoquinone (13). 12 (0.300 g, 0.886 mmol) and THF (6 mL) were added to a 25 mL round bottom flask containing a stir bar. A solution of eerie ammonium nitrate (1.46 g, 2.658 mmol) in water (3 mL) was slowly added to the flask and allowed to stir for 15 min. Water was added and the organic materials were extracted with dichloromethane. Flash column chromatography (silica gel using 1:1 hexanes/dichloromethane as eluent) afforded the desired product (0.129 g, 47 %). IR (KBr) 3047.5, 2203.0, 1716.2, 1655.3, 1568.3, 1215.4, 1100.6, 902.1, 757.6, 686.4 cm "1 . 1H NMR (400 MHz, CDC1 3 ) D 7.58 (dd, J = 7.9, 1.5 Hz, 4 H), 7.38 (m, 6 H), 6.99 (s, 2 H). 13 C NMR (100 MHz, CDC1 3 ) δ 182.87, 136.55, 133.34, 132.83, 130.57,128.97, 121.83, 105.26, 82.90. HRMS calc'd for C 22 ,H 12 ,O 2 : 308.0837 Found: 308.0834. 2-Bromo-5-ethynylphenyl-l,4-dimethoxybenzene (14). 11 (2.96 g, 10.0 mmol), bis(dibenzylideneacetone)palladium (0.115 g, 0.20 mmol), copper(I) iodide (0.038 g, 0.20 mmol), triphenylphosphine (0.131 g, 0.50 mmol), THF (15 mL), Hunig's base (6.97 mL, 40.0 mmol) and phenylacetylene (1.21 mL, 11.0 mmol) were used following the general procedure for coupling. The tube was heated in a 50 °C oil bath for 18 h. Column chromatography (silica gel using 19:1 hexanes/diethyl ether as eluent) afforded the desired product, somewhat impure (approximately 15% impurities by NMR) in moderate yield (1.02 g, 32% yield). This was taken onto the next step in this impure form. 1H NMR (400 MHz, CDC1 3 ) δ 7.54 (m, 2 H), 7.33 ( m, 3 H), 7.09 (s, 1 H), 7.02 (s, 1 H), 3.86 (s, 6 H). l,4-Dimethoxy-2-ethynylphenyl-5-(trimethylsiϊylethynyl)benzene. 14 (1.0 g, 3.15 mmol), bis(dibenzylideneacetone)palladium (0.036 g, 0.063 mmol), copper(I) iodide (0.012 g, 0.063 mmol), triphenylphosphine (0.042 g, 0.16 mmol), THF (20 mL), Hunig's base (2.2 mL, 12.6 mmol), and trimethylsilylacetylene (0.89 mL, 6.3 mmol) were used following the general procedure for couplings. The tube was capped and heated in a 60 °C oil bath for 1 d. Flash column chromatography (silica gel using 24:1 hexanes/ethyl acetate as eluent) afforded the desired product slightly impure (0.83 g, 79% yield). 1H NMR (400 MHz, CDC1 3 ) δ 7.55 (m, 2 H), 7.32 (m, 3 H), 6.98 (s, 1 H), 6.95 (s, 1 H), 3.84 (s, 3 H), 3.83 (s, 3 H), 0.27 (s, 9 H). l,4-Dimethoxy-2-ethynyl-5-(ethynylphenyl)benzene (15). 1 ,4-dimethoxy-2- ethynylphenyl-5-(trimethylsilylethynyl)benzene (0.830 g, 2.48 mmol), potassium carbonate (1.71 g, 12.4 mmol), methanol (50 mL), and dichloromethane (50 mL) were used following the general procedure for deprotection to afford the desired product (0.513 g, 79% yield). ! H NMR (400 MHz, CDC1 3 ) δ 7.55 (m, 2 H), 7.33 (m, 3 H), 7.00 (s, 1 H), 6.98 (s, 1 H), 3.87 (s, 3 H), 3.86 (s, 3 H), 3.39 (s, 1 H). 4,4'-Di(ethynylphenyl)-2',5'-dimethoxy-l-benzenethioacetate (16). 15 (0.513 g, 1.96 mmol), bis(dibenzylideneacetone)palladium(0) (0.058 g, 0.10 mmol), copper(I) iodide (0.019 g, 0.10 mmol), triphenylphosphine (0.066 g, 0.25 mmol), THF (20 mL), Hunig's base (1.37 mL, 7.84 mmol), and 4-(thioacetyl)iodobenzene (0.608 g, 2.16 mmol) were used following the general procedure for couplings. The tube was capped and heated in a 55 °C oil bath for 3 d. Flash column chromatography (silica gel using dichloromethane as eluent) afforded the desired product slightly impure (0.621 g, 76% yield). 1H NMR (400 MHz, CDC1 3 ) δ 7.57 (m, 4 H), 7.38 (d, J = 8.1 Hz, 2 H), 7.33 (m, 3 H), 7.03 (s, 1 H), 7.02 (s, 1 H), 3.874 (s, 3 H), 3.870 (s, 3 H), 2.40 (s, 3 H). 2-Ethynylphenyl-5-((4'-thioacetyl)ethynylphenyl)benzoquinone (17). 16 (0.050 g, 0.12 mmol), acetonitrile (5 mL), and THF (5 mL) were added to a 25 mL round bottom flask containing a stir bar. A solution of eerie ammonium nitrate (0.13 g, 0.24 mmol) in water (1 mL) was added in one portion. After stirring at room temperature for 30 min, another equivalent solution of eerie ammonium nitrate (0.13 g, 0.24 mmol) was added. After 20 additional min, the reaction was quenched by adding water (30 mL) to effect precipitation of an orange solid. Flash column chromatography (silica gel using dichloromethane as eluent) afforded the desired product (0.034 g, 74% yield). IR (KBr) 3053.0, 2924.3, 2852.6, 2205.4, 1703.4, 1652.7, 1568.8, 1483.7, 1442.2, 1354.8, 1221.3, 1105.4, 1089.4, 949.6, 920.1, 830.9, 758.2, 688.2, 620.6 cm "1 . 1H NMR (400 MHz, CDC1 3 ) δ 7.58 (m, 4 H), 7.42 (m, 2 H), 7.38 (m, 3 H), 6.98 (s, 1 H), 6.97 (s, 1 H), 2.42 (s, 3 H). 13 C NMR (100 MHz, CDC1 3 ) δ 193.22, 182.74, 182.67, 136.88, 136.51, 134.63, 133.34, 133.24, 132.99, 132.84, 130.94, 130.63, 128.99, 122.81, 121.80, 105.38, 103.99, 84.17, 82.92, 30.80. HRMS calc'd for C 24 ,H 14 ,O 3 ,S: 382.0664. Found: 382.0663. l,4-Dimethoxy-2,5-bis(trimethylsilyIethynyl)benzene. 11 (1.75 g, 5.91 mmol), bis(triphenylphosphine)palladium dichloride (0.207 g, 0.296 mmol), copper(I) iodide (0.113 g, 0.591 mmol), triphenylphosphine (0.155 g, 0.591 mmol), THF (20 mL), Hunig's base (4.1 mL, 23.64 mmol), and trimethylsilylacetylene (2.51 mL, 17.73 mmol) were used following the general procedure for couplings. The tube was capped and heated in a 55 °C oil bath for 2 d. Flash column chromatography (silica gel using 1:1 hexanes/dichloromethane as eluent) afforded the desired product (1.54 g, 79 % yield). IR (KBr) 2957.0, 2898.2, 2851.2, 2829.0, 2149.1, 1496.8, 1464.1, 1449.1, 1388.2, 1283.7, 1249.0, 1223.6, 1203.1, 1172.4, 1039.6, 883.2, 841.3, 757.4, 714.9, 696.2, 626.4 cm "1 . 1H NMR (400 MHz, CDC1 3 ) D6.89 (s, 2 H), 3.81 (s, 6 H), 0.25 (s, 18 H) 13 C NMR (100 MHz, CDC1 3 ) δ 154.56, 116.59, 113.81, 101.22, 100.84, 56.83, 0.40. HRMS calc'd for Cι 8 ,H 26 ,O 2 ,Si 2 : 330.1471, Found: 330.1468. l,4-Dimethoxy-2,5-diethynylbenzene (18). l,4-Dimethoxy-2,5- bis(trimethylsilylethynyl)benzene (1.50 g, 4.54 mmol), potassium carbonate (6.27 g, 45.4 mmol), methanol (50 mL), and dichloromethane (50 mL) were used following the general procedure for deprotection to give the desired product (0.829 g, 98 %). 1H NMR (400 MHz, CDC1 3 ) δ 6.96 (s, 2 H), 3.84 (s, 6 H), 3.37 (s, 2 H). 2,5-Bis(4'-(thioacetyl)ethynylphenyl)-l,4-dimethoxybenzene (19). 18 (0.810 g, 4.35 mmol), bis(dibenzylideneacetone)palladium (0.253 g, 0.44 mmol), copper(I) iodide (0.084 g, 0.44 mmol), triphenylphosphine (0.115 g, 0.44 mmol), THF (30 mL), Hunig's base (4.5 mL, 26.1 mmol), and 4-(thioacetyl)iodobenzene 22 (2.54 g, 9.14 mmol) were used following the general procedure for couplings. The solution was stirred in a 60 °C oil bath for 16 h. Crystallization from dichloromethane/hexanes afforded the desired product (1.81 g, 85 %). IR (KBr) 3129.1, 3057.4, 3006.2, 2975.5, 2940.0, 2847.4, 2207.2, 1697.7, 1506.8, 1483.1, 1463.1, 1396.2, 1279.2, 1223.5, 1122.2, 1034.2, 949.5, 898.8, 825.5, 765.6, 616.8 cm "1 . 1H NMR (400 MHz, CDC1 3 ) δ 7.57 (dt, J = 8.5, 1.9 Hz, 4 H), 7.39 (dt, J = 8.5, 2.0 Hz, 4 H), 7.01 (s, 2 H), 3.89 (s, 6 H), 2.42 (s, 6 H). 13 C NMR (100 MHz, CDC1 3 ) δ 193.85, 154.43, 134.58, 132.65, 128.64, 124.84, 116.08, 113.75, 94.76, 87.73, 56.91, 30.70. HRMS calc'd for C 2S ,H 22 ,O 4 ,S 2 ,: 486.0960 Found: 486.0956. 2,5-Bis(4'-(thioacetyI)ethynylphenyl)benzoquinone (20). 19 (0.050 g, 0.103 mmol), acetonitrile (5 mL), and THF (3 mL) were added to a 25 mL round bottom flask containing a stir bar. A solution of eerie ammonium nitrate (0.339 g, 0.618 mmol) in water (2 mL) was added in two portions at 30 min intervals. After stirring at room temperature for 3 h, the reaction was quenched by adding water to effect precipitation of an orange solid. Flash column chromatography (silica gel using dichloromethane as eluent) afforded the desired product (0.023 g, 49 % yield). IR (KBr) 2922.2, 2847.4, 2203.4, 1694.9, 1660.1, 1569.9, 1351.8, 1212.3, 1119.7, 1084.6, 1013.2, 960.3, 826.8, 620.6 cm "1 . 1H NMR (400 MHz, CDC1 3 ) δ 7.60 (dt, J = 8.3, 1.6 Hz, 4 H), 7.42 (dt, J = 8.3, 1.6 Hz, 4 H), 7.00 (s, 2 H), 2.43 (s, 6 H). 13 C NMR (100 MHz, CDC1 3 ) δ 193.23, 182.61, 136.86, 134.64, 133.25, 133.07, 130.97, 122.78, 104.14, 84.08, 30.79. HRMS calc'd for C 26 ,H 16 ,O 4 S 2 : 456.0500, Found: 456.0490. 2,5-Bis(4'-ethynylpyridyl)-l-nitrobenzene (22). To a solution of 2,5- dibromonitrobenzene (0.28 g, 0.997 mmol), bis(triphenylphosphine)palladium dichloride (0.07 g, 0.098 mmol), copper(I) iodide (0.019 g, 0.098 mmol), triphenylphosphine (0.106 g, 0.40 mmol) and K 2 CO 3 (1.1 g, 7.96 mmol) in THF (4 mL) were added via a cannula 21 (0.377 g, 2.15 mmol) in THF (4 mL) and MeOH (2 mL). The mixture was heated at 64 °C for 20 h. The solvent was removed by rotary evaporation and the black residue was washed with aqueous K 2 CO 3 and extracted with Et 2 O. The combined organic layers were dried over Na 2 SO 4 , filtered, and the solvent evaporated in vacuo. Purification by flash chromatography (silica gel, hexane/ AcOEt 70/30, 50/50, 20/80, 0/100) afforded 60 mg (24% yield) of the title compound as a yellow solid. Mp: 178-180 °C. IR (KBr) 3414.0, 3036.7, 1616.0, 1589.4, 1538.1, 1519.9, 1407.9, 1345.7, 1271.1, 1214.1, 828.3 cm "1 . 1H NMR (400 MHz, DMSO-d) δ 8.69 (br s, 4 H), 8.44 (d, 7=1.4 Hz, 1 H), 8.04 (1/2 ABqd, 7=8.0, 1.4 Hz, 1 H), 7.99 (1/2 ABq, J=8.0 Hz, 1 H), 7.60 (d, 7=5.8 Hz, 2 H), 7.57 (d, 7=5.8 Hz, 2 H). 13 C NMR (100 MHz, DMSO-d) δ 150.21, 150.13, 149.42, 136.27, 135.36, 129.16, 129.11, 127.96, 125.50, 125.39, 123.25, 116.55, 94.98, 90.63, 90.59, 88.13. HRMS calc'd for C 2 oHπN 3 O 2 : 325.0851, found: 325.0847. l-Bromo-4-(4'-ethynylpyridyl)-3-nitrobenzene (23). To a solution of 2,5- dibromonitrobenzene (0.43 g, 1.53 mmol), bis(triphenylphosphine)palladium(II) dichloride (0.052 g, 0.074 mmol), copper(I) iodide (0.015 g, 0.078 mmol), triphenylphosphine (0.079 g, 0.30 mmol) and K 2 CO 3 (0.83 g, 6.0 mmol) in THF (2 mL) were added via a cannula 21 (0.342 g, 1.95 mmol) in THE (4 mL) and MeOH (1.5 mL). The mixture was heated at 23 °C for 2 d. The solvent was removed by rotary evaporation and the residue was diluted with water and extracted with Et 2 O. The combined organic layers were dried over Na 2 SO 4 , filtered, and the solvent evaporated in vacuo. Purification by flash chromatography (silica gel, hexane/ AcOEt 90/10, 70/30, 50/50) afforded 330 mg (71% yield) of the title compound as an off-white solid. Mp: 166-171 °C. IR (KBr) 3424.4, 3093.3, 1592.3, 1521.4, 1409.3, 1341.4, 1272.6 cm "1 . 1H NMR (400 MHz, CDC1 3 ) δ 8.68 (br s, 2 H), 8.29 (d, 7=1.9 Hz, 1 H), 7.79 (dd, 7=8.3, 2.0 Hz, 1 H), 7.62 (d, 7=8.3 Hz, 1 H), 7.44 (d, 7=4.7 Hz, 2 H). 13 C NMR (100 MHz, CDC1 3 ) δ 149.96, 136.22, 135.69, 130.14, 128.08, 126.67, 125.65, 123.19, 116.48, 94.80, 87.81. HRMS calc'd for Cι 3 H 7 BrN 2 O 2 : 303.9672, found: 303.9682 . 5-Ethynylphenyl-2-(4'-ethynylpyridyl)-l-nitrobenzene (24). To a solution of 23 (88.8 mg, 0.293 mmol), bis(triphenylphosphine)palladium(π) dichloride (0.011 g, 0.016 mmol), copper(I) iodide (0.004 g, 0.021 mmol) and triphenylphosphine (0.008 g, 0.029 mmol) in THF (4 mL) were added Et 3 N (0.25 mL, 1.76 mmol) and phenylacetylene (0.1 mL, 9.1 mmol). The mixture was stirred at 56 °C for 36 h. The solvent was evaporated in vacuo. The residue was diluted with water and extracted with Et 2 O. The combined organic layers were dried over MgSO , filtered, and the solvent evaporated in vacuo. Purification by flash chromatography (silica gel, AcOEt/ hexane 20/80) afforded 65 mg (69% yield) of the title compound as a yellow solid. Mp: 130-132 °C. IR (KBr) 3445.3, 3046.3, 2203.5, 1548.5, 1529.1, 1399.9, 1341.6 cm "1 . 1H NMR (400 MHz, CDC1 3 ) δ 8.67 (br d, 7=4.9 Hz, 2 H), 8.27 (d, 7=1.5 Hz, 1 H), 7.76 (1/2 ABqd, 7=8.0, 1.6 Hz, 1 H), 7.72 (1/2 ABqd, 7=8.0, 0.5 Hz, 1 H), 7.56 (m, 2 H), 7.45 (dd, 7=5.9, 1.7 Hz, 2 H), 7.40 (m, 3 H). 13 C NMR (100 MHz, CDC1 3 ) δ 149.58, 135.39, 134.65, 131.81, 129.34, 128.54, 127.67, 125.32, 121.85, 116.66, 95.30, 94.30, 88.52, 86.63. HRMS calc'd for C 2 ιHι 2 N 2 O 2 : 324.0899, found: 324.0895. l-Bromo-4-ethynylphenyl-3-nitrobenzene (25). To a solution of 2,5- dibromonitrobenzene (0.937 g, 3.34 mmol), bis(dibenzylideneacetone)palladium (0.095 g, 0.166 mmol), copper(I) iodide (0.032 g, 0.168 mmol) and triphenylphosphine (0.173 g, 0.66 mmol) in THF (4 mL) were added Et 3 N (1 mL, 7.2 mmol) and phenylacetylene (0.5 mL, 4.56 mmol). The mixture was stirred at 23 °C for 48 h. The mixture was washed with a saturated solution of NH 4 CI and then extracted with Et 2 O. The combined organic layers were dried over Na 2 SO , filtered, and the solvent evaporated in vacuo. Purification by flash chromatography (silica gel, CH 2 C1 / hexane 1/8) afforded 0.48 g (47% yield) of the title compound as a yellow solid. Mp: 58-74 °C. IR (KBr) 3421.9, 3085.5, 2213.4, 1595.7, 1545.9, 1521.3, 1336.5, 1269.2 cm "1 . 1H NMR (400 MHz, CDC1 3 ) δ 8.23 (d, 7=1.9 Hz, 1 H), 7.72 (dd, 7=8.3 Hz, 2.0, 1 H), 7.59 (m, 3 H), 7.40 (m, 3 H). 13 C NMR (100 MHz, CDC1 3 ) δ 149.71, 135.91, 135.45, 131.99, 129.44, 128.46/ 127.78, 122.03, 121.75, 117.69, 98.43, 84.00. HRMS calc'd for C 14 H s NO 2 Br: 302.9720, found: 302.9725. 2-Ethynylphenyl-5-(4'-ethynylpyridyl)-l-nitrobenzene (26). To a solution of 25 (0.306 g, 1.01 mmol), K 2 CO 3 (0.713 g, 5.16 mmol), bis(triphenylphosphine)palladium dichloride (0.035 g, 0.05 mmol), copper® iodide (0.009 g, 0.047 mmol) and triphenylphosphine (0.052 g, 0.198 mmol) in THF (2 mL) were added via a cannula 21 (0.217 g, 1.24 mmol) in THF (2 mL) and MeOH (1 mL). The mixture was heated at 60 °C for 18 h. The solvent was removed by rotary evaporation and the brown residue was diluted with water and extracted with Et O. The combined organic layers were dried over Na 2 SO , filtered, and the solvent evaporated in vacuo. Purification by flash chromatography (silica gel, AcOEt/hexane 20/80, 40/60) afforded 260 mg (79% yield) of the title compound as a yellow solid. Mp: 144- 146 °C. IR (KBr) 3442.3, 3053.0, 2209.4, 1631.3, 1584.8, 1524.7, 1404.3, 1344.7, 1269.0, 826.4, 755.2, 686.6 cm 4 . 1H NMR (400 MHz, CDC1 3 ) δ 8.67 (dd, 7=4.4, 1.6 Hz, 2 H), 8.27 (br s, 1 H), 7.74 (m, 2 H), 7.63 (d, 7=1.8 Hz, 1 H), 7.60 (m, 1 H), 7.42 (m, 5 H). 13 C NMR (100 MHz, CDC1 3 ) δ 149.99, 135.41, 134.65, 132.14, 130.19, 129.61, 128.54, 127.95, 125.50, 122.68, 122.06, 119.15, 99.67, 90.83, 90.27, 84.62. HRMS calc'd for C 2 ιH 12 N 2 O 2 : 324.0899, found: 324.0897. 2,5-Bis(trimethylsilylethynyl)-4-nitroacetanilide (27). To a solution of 6 (0.78 g, 2.3 mmol), bis(dibenzylideneacetone)palladium (0.068 g, 0.118 mmol), copper(I) iodide (0.023 g, 0.012 mmol), triphenylphosphine (0.123 g, 0.47 mmol) in THF (8 mL) were added Et 3 N (1 mL, 7.2 mmol) and trimethylsilylacetylene (1 mL, 7.0 mmol). The mixture was heated at 67 °C for 48 h. The solvent was removed by rotary evaporation and the brown residue was diluted with water and extracted with Et 2 O. The combined organic phases were dried over Na SO , filtered, and the solvent evaporated in vacuo. Purification by flash chromatography (silica gel, CH 2 C1 2 / hexane 35/65) afforded 410 mg (47% yield) of the title compound as an off-white solid. Mp: 162-164°C. JJ (KBr) 3372.9, 2962.9, 2146.0, 1727.2, 1611.2, 1544.9, 1501.5, 1457.1, 1404.3, 1338.2, 1250.6, 1222.3, 881.9 cm "1 . 1H NMR (400 MHz, CDC1 3 ) δ 8.75 (s, 1 H), 8.15 (s, 1 H), 8.10 (br s, 1 H), 2.27 (s, 3 H), 0.33 (s, 9 H), 0.28 (s, 9 H). 13 C NMR (100 MHz, CDCI 3 ) δ 168.21, 144.19, 142.41, 128.11, 123.82, 120.18, 111.52, 106.66, 106.16, 99.50, 97.44, 24.90, -0.31, -0.46. HRMS calc'd for C 18 H 24 N 2 O 3 Si 2 : 372.1326, found: 372.1326. 2,5-Bis(4'-ethynylpyridyl)-4-nitroaniline (28). To a solution of 27 (0.056 g, 0.15 mmol), 4-iodopyridine (0.08 g, 0.39 mmol), K 2 CO 3 (0.17 g, 1.2 mmol), bis(triphenylphosphine)palladium(II) dichloride (0.01 g, 0.015 mmol), copper(I) iodide (0.004 g, 0.021 mmol) and triphenylphosphine (0.016 g, 0.061 mmol) in THF (4 mL) was added MeOH (1 mL). The mixture was heated at 60 °C for 50 h. The solvent was removed by rotary evaporation and the brown residue was diluted with water and extracted with AcOEt. The combined organic phases were dried over Na 2 SO , filtered, and the solvent evaporated in vacuo. Purification by flash chromatography (silica gel, AcOEt) afforded 8 mg (16% yield) of the title compound as a yellow solid. Mp: 154-160 °C. IR (KBr) 3730.2, 3438.6, 2204.8, 1592.4, 1541.1, 1409.8, 1308.5, 1249.9, 818.8 cm "1 . 1H NMR (400 MHz, CDC1 3 ) δ 8.67 (dd, 7=4.4, 1.7 Hz, 2 H), 8.65 (dd, 7= 4.5, 1.7 Hz, 2 H), 8.34 (s, 1 H), 7.44 (dd, 7=4.5, 1.7 Hz, 2 H), 7.40 (dd, 7=4,4, 1.6 Hz, 2 H), 6.99 (s, 1 H), 5.03 (br s, 2 H). 13 C NMR (100 MHz, CDC1 3 ) δ 151.26, 150.03, 149.90, 139.56, 130.71, 130.52, 130.00, 125.65, 125.33, 120.33, 118.52, 106.57, 94.67, 94.19, 89.55, 87.27. HRMS calc'd for C 20 H 12 N 4 O 2 : 340.0960, found: 340.0958. 2-Amino-4-(4'-ethynylpyridyl)-5-nitrobromobenzene (29). To a solution of 6 (0.877 g, 8.84 mmol), K 2 CO 3 (1.08 g, 7.81 mmol), bis(triphenylphosphine)palladium dichloride (0.054 g, 0.077 mmol), copper(I) iodide (0.025 g, 0.13 mmol) and triphenylphosphine (0.068 g, 0.26 mmol) in THF (4 mL) were, added via a cannula 21 (0.404 g, 2.30 mmol) in THF (8 mL) and MeOH (3 mL). The mixture was stirred at 23 °C for 1 d. The solvent was evaporated in vacuo. The residue was diluted with water and extracted with AcOEt. The combined organic phases were dried over MgSO , filtered and the solvent evaporated in vacuo. Purification by flash chromatography (silica gel, AcOEt/hexane 40/60 50/50) afforded 290 mg (39% yield) of the title compound as a yellow solid. Mp: 226- 228 °C. IR (KBr) 3385.4, 3297.7, 3171.3, 1646.8, 1591.7, 1556.9, 1471.3, 1297.8 cm "1 . Η NMR (400 MHz, DMSO-d) δ 8.66 (br d, 7=3.8 Hz, 2 H), 8.32 (d, 7=1.3 Hz, 1 H), 7.53 (br d, 7=4.5 Hz, 2 H), 7.06 (d, 7=1.3 Hz, 1 H), 6.94 (br s, 2 H). 13 C NMR (100 MHz, DMSO-d) δ 151.33, 150.12, 136.44, 130.70, 129.64, 125.32, 118.13, 117.73, 106.02, 91.85, 89.72. HRMS calc'd for Cι 3 H 8 BrN 3 O 2 : 316.9800, found: 316.9801. 4-Amino-2-(4'-ethynylpyridyl)-l-nitro-5-(trimethylsilylethynyl)benzene. To a solution of 29 (0.310 g, 0.975 mmol), bis(triphenylphosphine) palladium dichloride (0.035 g, 0.05 mmol), copper(I) iodide (0.011 g, 0.05 mmol) and triphenylphosphine (0.026 g, 0.10 mmol) in THF (10 mL) were added Et 3 N (0.9 mL, 6.5 mmol) and trimethylsilylacetylene (0.2 mL, 1.4 mmol). The mixture was stirred at 60 °C for 2 d. The solvent was evaporated in vacuo. The residue was diluted with water and extracted with AcOEt. The combined organic phases were dried over MgSO , filtered, and the solvent evaporated in vacuo. Purification by flash chromatography (silica gel, Et 2 O) afforded 160 mg (49% yield) of the title compound as a yellow solid. Mp: 145-150 °C. IR (KBr) 3451.9, 3379.1, 2960.5, 2149.5, 1620.4, 1597.9, 1545.5, 1512.2, 1317.0 cm "1 . 1H NMR (400 MHz, CDC1 3 ) δ 8.65 (dd, 7=4.6, 1.5 Hz, 2 H), 8.25 (s, 1 H), 7.44 (dd, 7=4.3, 1.5 Hz, 2 H), 6.93 (s, 1 H), 4.90 (s, 2 H), 0.30 (s, 9 H). 13 C NMR (100 MHz, CDC1 3 ) δ 151.44, 149.90, 139.35, 130.65, 130.43, 125.65, 119.56, 118.06, 107.93, 104.28, 98.37, 93.70, 89.79, -0.15. HRMS calc'd for Cι 8 H 17 N 3 O 2 Si: 335.1090, found: 335.1089. 4-Amino-5-ethynyl-2-(4'-ethynylpyridyl)-l-nitrobenzene. (30). To a solution of 4- Amino-2-(4'-ethynylpyridyl)-l-nitro-5-(trimethylsilylethynyl)benzene (160 mg, 0.477 mmol) in MeOH (15 mL) and CH 2 C1 2 (15 mL) was added K 2 CO 3 (0.66 g, 4.77 mmol). The solution was stirred at 23 °C for 2 h. The reaction mixture was diluted with water and extracted with AcOEt. The combined organic layers were dried over MgSO 4 , filtered, and the solvent evaporated in vacuo. The reaction afforded 0.11 g (88% yield) of the title compound as a yellow solid. The product was too unstable to attain its complete characterization data. Η NMR (400 MHz, DMSO-d) δ 8.67 (dd, 7=4.5, 1.6 Hz, 2 H), 8.12 (s, 1 H), 7.53 (dd, 7=4.5, 1.6 Hz, 2 H), 7.03 (s, 1 H), 6.97 (br s, 2 H), 4.70 (s, 1 H). 4-Amino-2-(4'-ethynylpyridyl)-5-(4'-thioacetylphenyIethynyl)-l-nitrobenzene (31). To a solution of 30 (0.110 g, 0.418 mmol), 4-thioacetyliodobenzene 10 (0.124 g, 0.446 mmol), bis(triphenylphosphine)palladium(II) dichloride (0.015 g, 0.021 mmol), copper(I) iodide (0.004 g, 0.021 mmol) and triphenylphosphine (0.014 g, 0.053 mmol) in THF (13 mL) was added Et 3 N (0.4 mL, 2.9 mmol). The mixture was stirred at 50 °C for 2 d. The reaction was checked by TLC (AcOEt/hex 75/25). More bis(triphenylphosphine)palladium dichloride (0.014 g, 0.020 mmol), copper(I) iodide (0.035 g, 0.018 mmol) and triphenylphosphine (0.085 g, 0.324 mmol) were added and the reaction was stirred at 60 °C for 1 d. The solvent was evaporated in vacuo. The residue was diluted with water and extracted with AcOEt. The combined organic layers were dried over MgSO , filtered, and the solvent evaporated in vacuo. Purification by flash chromatography (silica gel, AcOEt/hex 66/33) afforded 130 mg (75% yield) of the title compound as a yellow solid. Mp: 185-188 °C. IR (KBr) 3438.2, 3195.9, 2922.4, 1695.4, 1627.7, 1596.5, 1545.1, 1514.8, 1477.2, 1402.8, 1316.4, 1249.9 cm "1 . 1H NMR (400 MHz, DMSO-d) δ 8.68 (br d, 7=4.0 Hz, 2 H), 8.23 (s, 1 H), 7.79 (d, 7=8.1 Hz, 2 H), 7.54 (d, 7=5.0 Hz, 2 H), 7.49 (d, 7= 8.0 Hz, 2 H), 7.13 (br s, 2 H), 7.06 (s, 1 H), 2.46 (s, 3 H). 13 C NMR (100 MHz, DMSO-d) δ 192.98, 153.79, 150.13, 136.28, 134.31, 132.32, 130.69, 129.67, 128.66, 125.34, 123.05, 118.70, 118.26, 105.43, 95.72, 92.51, 90.12, 85.54, 30.32. HRMS calc'd for C 23 Hι 5 N 3 O 3 S: 413.0834, found: 413.0940. 2-(4'-Ethynylpyridyl)-4-nitro-5-phenyIaniline (32). To a solution of 7 (80.5 mg, 0.241 mmol), K 2 CO 3 (0.151 g, 1.09 mmol), bis(triphenylphosphine)palladium(U) dichloride (0.009 g, 0.014 mmol), copper(I) iodide (0.003 g, 0.014 mmol) and triphenylphosphine (0.014 g, 0.053 mmol) in THF (2 mL) were added via a cannula 1 (0.053 g, 0.3 mmol) in THE (2 mL) and MeOH (1 mL). The mixture was heated to 70 °C for 3 d. The solvent was removed by rotary evaporation and the brown residue was diluted with water and extracted with Et 2 O. The combined organic layers were dried over Na SO , filtered and the solvent evaporated in vacuo. Purification by flash chromatography (silica gel, AcOEt/hex 30/70) afforded 60 mg (79% yield) of the title compound as a yellow solid. Mp: 187-190 °C. IR (KBr) 3410.2, 3323.4, 3212.1, 2215.1, 1627.6, 1592.4, 1548.4, 1511.7, 1410.5, 1331.9 cm "1 . 1H NMR (400 MHz, CDC1 3 ) δ 8.64 (br d, 7=4.8, 2 H), 8.16 (s, 1 H), 7.39 (m, 5 H), 7.27 ( , 2 H), 6.62 (s, 1 H), 5.03 (br s, 2 H). 13 C NMR (100 MHz, CDC1 3 ) δ 151.23, 149.82, 140.65, 138.82, 138.19, 130.49, 128.36, 128.06, 127.52, 125.34, 116.41, 104.85, 93.24, 87.89. HRMS calc'd for C 19 Hι 3 N 3 O 2 : 315.1008, found: 315.1011. l-Bromo-4-(4'-ethynyl)pyridine-3-nitrobenzene (34). To a solution of 33 1 (0.84 g, 2.34 mmol), bis(triphenylphosphine)palladium dichloride (0.083 g, 0.117 mmol), copper(I) iodide (0.022 g, 0.117 mmol), K 2 CO 3 (1.94 g, 14.04 mmol) in THF (4 mL) were added 21 (0.451 g, 2.57 mmol) in THF (12 mL) via a cannula and MeOH (4 mL). The mixture was heated to 55 °C for 14 h. The solvent was removed by rotary evaporation and the residue was diluted with water, washed with brine and extracted with AcOEt. The combined organic phases were dried over MgSO , filtered and the solvent evaporated in vacuo. Purification by flash chromatography (silica gel, AcOEt) afforded 271 mg (34% yield) of the title compound as a yellow solid. Mp: 224-229 °C. IR (KBr) 3451.7, 3351.1, 3202.6, 2206.4, 1622.9, 1588.4, 1539.0, 1474.4, 1306.7, 1249.8 cm "1 . 1H NMR (400 MHz, DMSO- ) δ 8.64 (d, 7= 5.7 Hz, 2 H), 8.25 (s, 1 H), 7.67 (dd, 7=4.5, 1.5 Hz, 2 H), 7.59 (m, 2 H), 7.47 (m, 3 H), 7.15 (br s, 1 H), 7.03 (s, 1 H). 13 C NMR (100 MHz, DMSO-d) δ 153.97, 149.83, 136.31, 131.67, 131.17, 130.01, 129.69, 128.99, 125.45, 121.78, 120.40, 118.06, 103.92, 96.13, 93.41, 88.37, 86.25. HRMS calc'd for C 2 ιH 13 N 3 O 2 : 339.1008, found: 339.1004. l-Bromo-3-nitro-4-(4-aminophenylethynyl)benzene (36). l,4-Dibromo-2- nitrobenzene (5.62 g, 20.0 mmol), bis(triphenylphosphine)palladium dichloride (0.140 g, 0.20 mmol), copper(I) iodide (0.038 g, 0.20 mmol), triethylamine (10.0 mL), THF (10 mL) and 35 (1.170 g, 10.0 mmol) were used following the general procedure for couplings. The reaction mixture was stirred at room temperature for 4 h. After solvent removal in vacuo, the residue was chromatographed on a column of silica (dichloromethane as eluent) to give a mixture of the desired product along with its regioisomer as a red solid. The desired product was isolated from the mixture by a two-fold recrystallization from dichloromethane/hexanes as fine bright red needles (1.561 g, 49% yield). Mp 147-149 °C. IR (KBr) 3457, 3367, 2194, 1623, 1593, 1513, 1550, 1334, 1273, 1136, 834, 817, 528 cm "1 . 1H NMR (400 MHz, CDC1 3 ) D 8.21 (d, 7=2.0 Hz), 7.67 (dd, 7=8.4, 2.0 Hz), 7.51 (d, 7=8.4 Hz), 7.96 (m, AA' part of AAXX' pattern, 7=8.2, 2.7, 1.9, 0.4 Hz, 2 H), 7.93 (m, XX' part of AA X' pattern, 7=8.2, 2.7, 1.9, 0.4 Hz, 2 H), 3.39 (s, 2 H). 13 C NMR (100 MHz, CDC1 3 ) D 149.27, 147.85, 135.82, 135.12, 133.71, 127.73, 120.62, 118.59, 114.63, 111.09, 100.24, 82.86. HRMS calc'd for C 14 H 9 N 2 BrO 2 : 315.9848, found: 315.9845. 4-(2-Nitro-4-phenylethynylphenylethynyl)aniIine (37). 36 (0.697 g, 2.20 mmol), bis(triphenylphosphine)palladium dichloride (0.062 g, 0.088 mmol), copper(I) iodide (0.0084 g, 0.044 mmol), triethylamine (10.0 mL) and ethynylbenzene (0.306 g, 3.00 mmol) were used following the general procedure for couplings. The reaction mixture was stirred at 80 °C for 2 h. After solvent removal in vacuo, the residue was chromatographed on a column of silica with dichloromethane to give red needles of the desired product (0.72 g, 97% yield) Mp 166-168 °C. IR (KBr) 3454, 3381, 3360, 2177, 2197, 1594, 1623, 1539, 1520, 1299, 1342, 1133, 829, 758, 690, 527 cm "1 . 1H NMR (400 MHz, CDC1 3 ) D8.20 (dd, 7=1.6, 0.3 Hz), 7.66 (dd, 7=8.2, 1.6, Hz), 7.61 (d, 7=8.1 Hz), 7.52-7.57 (m, 2 H), 7.36-7.43 (m, 5 H), 3.94 (s, 2 H). 13 C NMR (100 MHz, CDC1 3 ) D 148.93, 147.81, 135.12, 134.04, 133.76, 131.74, 129.04, 128.49, 127.59, 122.97, 122.18, 118.95, 114.64, 111.29, 100.75, 93.03, 87.05, 83.71. HRMS calc'd for C 22 H 14 N 2 O 2 : 338.1055, found: 338.1058. 4-(2-Nitro-4-phenyIethynylphenylethynyl)benzenediazonium tetrafluoroborate (38). Following the general diazotization procedure 37 (0.0845 g, 0.250 mmol) was treated with NOBF 4 (0.0322 g, 0.275 mmol) in acetonitrile (2 mL)/sulfolane (2 mL). The product was precipitated with ether (12 mL) as dark orange scales. The salt was washed with ether and reprecipitated from DMSO (0.5 mL) and CH C1 2 (20 mL) as lustrous dark orange plates (0.0885 g, 81% yield). IR (KBr) 3103, 2279, 2209, 1576, 1345, 1540, 1084, 841, 764 cm "1 . 1H NMR (400 MHz, CDCl 3 /DMSO-d 6 , line width of about 1.9 Hz was observed) D 8.78 (d, 7=8.9 Hz, 2 H), 8.30 (s, 1 H), 8.03 (d, 7=8.9 Hz, 2 H), 7.85-7.92 (m, 2 H), 7.57-7.60 (m, 2 H), 7.42- 7.44 (m, 3H). 13 C NMR (100 MHz, CDCl 3 /DMSO-d 6 ) D 149.00, 135.46, 134.85, 134.15, 133.31, 132.84, 1.34, 129.13, 128.21, 127.15, 125.66, 121.06, 114.81, 114.25, 94.57, 94.42, 94.11, 86.29. 4-(3-Nitro-4-phenylethynylphenylethynyl)aniline (39). 25 (1.208 g, 4.0 mmol), bis(triphenylphosphine)palladium dichloride (0.070 g, 0.10 mmol), copper(I) iodide (0.019 g, 0.10 mmol), triethylamine (6.0 mL), THF (6.0 mL) and 35 (0.479 g, 4.10 mmol) were used following the general procedure for couplings. The reaction mixture was stirred at room temperature for 15 h. After solvent removal in vacuo, the residue was chromatographed on a short column of silica with dichloromethane/hexanes (1:1) to afford the desired product as an orange solid (0.560 g, 44% yield): mp 175-177 °C. IR (KBr) 3303, 2985, 1696, 1587, 1522, 1406, 1314, 1243, 1153, 1060, 839, 757, 692 cm "1 . 1H NMR (400 MHz, CDC1 3 ) Q8.16 (t, 7=1.0 Hz, IH), 7.64 (d, 7=1.0 Hz, 2H), 7.58-7.61 (m, 2H), 7.34-7.40 (m, 3H), 7.35 (m, AA' part of AA X' pattern, 7=8.0, 2.5, 2.0, 0.4 Hz, 2 H), 6.65 (m, XX' part of AA'XX' pattern, 7=8.0, 2.5, 2.0, 0.4 Hz, 2 H), 3.91 (s, 2H). 13 C NMR (100 MHz, CDC1 3 ) 149.4, 147.5, 134.9, 134.3, 133.3, 132.0, 129.3, 128.5, 127.1, 124.9, 122.3, 117.1, 114.7, 11.1, 98.4, 94.9, 85.3, 85.0. HRMS calc'd for C 22 H 14 N 2 O 2 : 338.1055, found: 338.1059. 4-(3-Nitro-4-phenylethynylphenylethynyl)benzenediazonium tetrafluoroborate (40). Following the general diazotization procedure, 39 (0.0676 g, 0.200 mmol) was treated with NOBF (0.025 g, 0.210 mmol) in acetonitrile (2 mL)/sulfolane (2 mL). The product was precipitated with ether (20 mL) as fine orange-red crystals. The salt was washed with ether and reprecipitated from DMSO (0.6 mL) and CH 2 C1 2 (10 mL) as heavy lustrous red plates (0.0676 g, 77% yield). IR (KBr) 3101, 2279, 2209, 1576, 1540, 1346, 1083, 1034, 840, 764 cm "1 . 1H NMR (400 MHz, CDCl 3 /DMSO-d 6 ) D 7.94 (m, AA' part of AA'XX' pattern, 7=8.7, 2.4, 1.7, 0.4 Hz, 2 H), 7.82 (dd, 7=1.7, 0.4 Hz, 1 H), 7.49 (m, XX' part of AA'XX' pattern, 7=8.7, 2.4, 1.7, 0.4 Hz, 2 H), 7.62 (dd, 7=8.1, 1.7 Hz, 1 H), 7.56 (dd, 7=8.1, 0.4 Hz, 1 H), 7.07 (m, AA' part of AA'XX'Y pattern, 7=7.8, 7.6, 1.8, 1.3, 1.3, 0.6 Hz, 2 H), 6.94 (tt, 7= 7.6, 1.3 Hz, 1 H), 6.91 (m, YY' part of AA'XX'Y pattern, 7=7.8, 7.6, 1.8, 1.3, 1.3, 0.6 Hz, 2 H). 13 C NMR (100 MHz, CDCl 3 /DMSO-d 6 ) D 137.24, 136.97, 136.23, 135.40, 133.72, 133.00, 131.08, 129.96, 129.48, 122.81, 122.75, 120.68, 114.12, 100.47, 98.81, 91.04, 85.57. 4-(2,5-Dinitro-4-(4-aminophenylethynyl)phenylethynyl)aniline (42). 1 ,4-Dibromo- 2,5-dinitrobenzene 12 (0.977 g, 3.0 mmol), bis(triphenylphosphine)palladium dichloride (0.042 g, 0.06 mmol), copper® iodide (0.011 g, 0.06 mmol), triethylamine (5.0 mL), THF (5.0 mL) and 4-ethynylaniline (0.468 g, 4.00 mmol) were used following the general procedure for couplings. The reaction mixture was stirred at room temperature for 12 h. After solvent removal in vacuo, the residue was sonicated with dichloromethane (10 mL) and filtered. The filter cake was washed 5X with dichloromethane (10 mL) and dried in vacuo to afford dark purple crystals of the diamine 42 (0.432 g, 36% yield). Mp >270 °C. IR (KBr) 3494, 3387, 2184, 1600, 1400, 1523, 1537, 1308, 1337, 1251, 1136 cm "1 . 1H NMR (400 MHz, DMSO-da) D8.37 (s, 2 H), 7.27-7.29 (m, 2 H), 6.59-6.61 (m, 2 H), 5.93 (br s, 4 H). 13 C NMR (100 MHz, DMSO-d 6 ) Q 151.18, 149.89, 133.67, 129.43, 116.95, 113.66, 106.10, 103.45, 82.23. HRMS calc'd for C 22 Hι 4 N 4 O 4 : 398.1015, found 398.1018. 4-(2,5-Dinitro-4-(4-diazoniophenylethynyI)phenylethynyl)benzenediazonium tetrafluoroborate (43). Following the general diazotization procedure 42 (0.199 g, 0.500 mmol) was treated with NOBF (0.128 g, 1.10 mmol) in acetonitrile (5.0 mL)/sulfolane (5.0 mL). The product was precipitated with ether (20 mL). The salt was washed with ether and reprecipitated from DMSO and CH 2 C1 2 as light-sensitive yellow crystals (0.215 g, 72% yield). IR (KBr) 3107, 2291, 1579, 1546, 1342, 1078, 830 cm "1 . 1H NMR (400 MHz, CDCl 3 /DMSO- d 6 ) D 8.85 (s, 2H), 8.79 (d, 7=9 Hz, 2 H), 8.20 (d, 7=9 Hz, 2 H). 13 C NMR (100 MHz, CDCl 3 /DMSO-d 6 ) D 150.60, 133.93, 133.83, 133.14, 132.40, 131.75, 117.62, 116.32, 96.91, 91.51. Many oligo(phenylene ethynylene)s containing reversibly reducible functionalities based on quinone and nitro cores have been synthesized. These molecules have methods of attachment to a metal surface ranging from the standard protected thiol groups to the novel diazonium and pyridyl linkages. EXAMPLE 2 Molecular electronic devices containing pyridine units Figure 6 shows the two groups of potential molecular devices that have been synthesized. The first group has a nitro functionality on the internal phenyl ring, which was designed to retain electrons so that the molecule could work as a memory element. The second group has a nitro and an amino group, which have been shown to work similarly albeit at lower temperature. The potential molecular devices 2 and 4 were envisioned to have two pyridyl terminal groups so that they could serve as cross-linkers for gold connections. Scheme 2. (a) K 2 CO 3 , MeOH, Pd(PPh 3 ) 2 Cl 2 , PPh 3 , Cul, THF, 64 °C, 20 h, 24%. Scheme 2 outlines the synthesis of 2 from 2,5-dibromonitrobenzene. 1 was easily prepared via Sonogashira 6 coupling of 4-iodopyridine 7 and trimethylsilylacetylene (99%). Potassium carbonate is used as a base for the in situ removal of the TMS protecting group and for the coupling, as the free alkyne decomposes after a few hours. Attempts to perform the reaction at room temperature gave mostly the bis(ethynylpyridine) and coupling at one site of the aryl dibromide. Scheme 2. (a) Et 3 N, Pd(dba) 2 , PPh 3 , Cul, THF, 60 °C, 48 h, 47%. (b) K 2 CO 3 , MeOH, Pd(PPh 3 ) 2 Cl 2 , PPh 3 , Cul, THF, 60 °C, 50 h, 16%. Compound 4 resembles 2, but has a nitroaniline core instead of a nitro core. Unlike the potential molecular device 2, the synthesis of 4 (Scheme 2) commenced with the coupling of 2,5-dibromo-4-nitroacetanilide 9 with trimethylsilylacetylene to give 3, which was then coupled with 4-iodopyridine in low yield. The low yield of the coupling reactions could be due to cyclization between the nitro and the alkyne unit. 8 Scheme 3. (a) K 2 CO 3 , MeOH, Pd(PPh 3 ) 2 Cl 2 , PPh 3 , Cul, THF, rt, 24 h, 39%. (b) Et 3 N, Pd(PPh 3 ) 2 Cl 2 , PPh 3 , Cul, THF, 60 °C. (c) K 2 CO 3 , MeOH, CH 2 C1 2 , rt, 2 h, 88%. The synthesis of 8 is shown in Scheme 3. 8 has a protected benzenethiol terminal group, which can bind to a gold surface. The other end of the molecule has a pyridyl group, which could possibly serve as a better top-layer linker than the phenyl group. 8 was synthesized by coupling the 2,5-dibromo-4-nitroacetanilide with 1 in a moderate yield to afford compound 5. Compound 5 was then coupled with trimethylsilylacetylene to afford 6 in 49% yield, which was deprotected with potassium carbonate to give 7. The last step of this synthesis was the coupling with 4-thioacetyliodobenzene, which afforded the potential device 8 in good yield (75 %). 9 10 Scheme 4. (a) K 2 CO 3 , MeOH, Pd(PPh 3 ) 2 Cl 2 , PPh 3 , Cul, THF, rt, 2 d, 71%. (b) Et 3 N, Pd(PPh 3 ) 2 Cl 2 , PPh 3 , Cul, THF, 56 °C, 36 h, 69%. 10 and 12 were synthesized to study the importance of the position of the nitro group relative to the "alligator clip" during the self-assembly. 10, which has the nitro group oriented toward the pyridyl group (Scheme 4), was synthesized by first coupling 1 with 2,5- dibromonitrobenzene, with in situ removal of the TMS group to give 9 in good yield. Coupling of 9 with phenylacetylene afforded 10. Scheme 5. (a) Et 3 N, Pd(dba) 2 , PPh 3 , Cul, THF, rt, 48 h, 47%. (b) K 2 CO 3 , MeOH, Pd(PPh 3 ) 2 Cl 2 , PPh 3 , Cul, THF, 64 °C, 18 h, 79%. The synthesis of 12 (Scheme 5), which has the nitro group pointing away from the pyridyl group, resembles the approach used for 10 except that the steps are reversed. In this case, the phenylacetylene was first coupled to 2,5-dibromonitrobenzene to give 11 in a moderate yield. 1 was then coupled to 11 to afford 12 in good yield. In order to conduct electrons with minimal inhibition, these organic oligomers preferably have all their phenyl rings in the same plane. If the terminal phenyl ethynyl group is replaced by a phenyl group, the molecule becomes slightly twisted. To study the effect of this rotational barrier, 14 was synthesized. The Suzuki coupling of 2,5-dibromo-4- nitroacetanilide with phenyl boronic acid was used to synthesize compound 13 (Scheme 6), which was then coupled to 4-(trimethylsilylethynyl)pyridine (1) to afford 14. The structures of compounds 2, 4, 8, 10, 12 and 14 were confirmed by IR, 1H NMR, 13 C NMR and MS. Scheme 6. (a) Pd(dba) 2 , PPh 3 , Cs 2 CO 3 , toluene, 67 °C, 3 d, 51%. (b) K 2 CO 3 , MeOH, Pd(PPh 3 ) 2 Cl 2 , PPh 3 , Cul, THF, 70 °C, 3 d, 79%. In conclusion, the synthesis of conjugated aromatic molecules containing pyridine units for molecular electronics was accomplished using palladium-catalyzed couplings. EXAMPLE 3 Negative differential resistance Referring again to Figure 3, negative differential resistance was observed in exemplary molecular diodes 30, in particular a molecular a mono-nitro substituted oligophenylene 32, in particular 4,4'-diphenyleneethynelene-2'-nitro-l-benzenethiol and a di-nitro ' substituted oligophenylene 34, in particular 2',5'-dinintro-4,4'-diphenyleneethynylene-l-benzenethiol. Referring now to Figures 4A and 4B, the I(V) response curves of the molecules shown in Figure 2 (where I denotes current and V denotes voltage) are shown. These curves were obtained by measuring the response of a self-assembled monolayer of molecules 32 and molecules 34. In each monolayer the molecules were oriented with the thiol substituted ends contacting a gold lead and the unsubstituted opposite ends contacting a second gold lead. Referring now in particular to Figure 4A, for molecule 32, initially the I(V) response is in the "0" state (open circles). Once application of a 1.75V pulse takes place, the molecule sets into a new state, "1" (black circles), that exhibits negative differential resistance (NDR) behavior, where the current rises then falls with increased voltage. Referring now in particular to Figure 4B, for molecule 34, initially the I(V) response is in a "1" state (closed circles), that exhibits NDR. Once application of a 1.5 V pulse takes place, the molecule sets into a new state, "0" (open circles). The initial state is restored by application of a negative bias. This is the reverse of the initial/final switching observed for molecule 32, as shown in Figure3A. However, each behavior is exemplary of the duality of switch states. An advantage of molecule 34 is that it is a molecule that exhibits negative differential resistance at room temperature. Further, the retention of the switched state was observed for 24 h. It is believed that longer retention times will be possible with improved packaging of the system. It is preferred that a nanocell 12 is hermetically sealed to improve stability of the switched states for longer times. The NDR curve shown in Figure 4B was used for the dynamic nanocell simulations and the SPICE simulations described below. EXAMPLE 4 It has been discovered by the present inventors that simulated nanocells that are based on nano-networks containing arrayed molecular switches connected by nanoparticles are trainable to act as exemplary known logic devices. The molecular switches are molecules that exhibit an I(V) response that is characterized by negative differential resistance It is believed that the simulated nanocells are representative of actual physical nanocells. Hence, it is believed that, for the first time, a technique for programming an actual nanocell has been discovered. The inventors are aware of no other demonstration of the learning of logic by a network that includes "dendrites" (using the conventional analogy to the structure of the brain) that have these I(V) characteristics. In particular, conventional neural network models of the brain and other simulated systems usually are based on representations of systems that have "dendrite" I(V) curves selected from among step functions, hyperbolic tangents, and the like, none of which have negative differential resistance. A genetic algorithm was used to train simulated nanocells omnisciently. That is, the algorithm knew the states of remote molecular switches. The algorithm trained the nanocells by omnipotent switching, that is by adjusting the states of the switches directly. It is nonetheless believed that these results are representative of results that are achievable by self-adaptive algorithms that mortally configure remote molecular switches by adjusting voltages at input and output leads. General Programming The object in programming or training a nanocell is to take a random, fixed nanocell and turn its switches "on" and "off" until it functions as a target logic device. The physical position of each molecular switch is first fixed; i.e. the internal topology of the nanocell is static. The nanocell is then trained post-fabrication. Only the states, "on" or "off", of the molecular switches can change. Here we introduce the terms omniscience, omnipotence and mortal switching in relation to the programming algorithms used. By omniscience we mean that the connections within the nanocell and the location and state of each switch are known. Omnipotence means that the search algorithm knows the location of each molecular switch and has precise and selective access to reversibly set its "on" or "off" state. Naturally, the definition of omnipotence includes omniscience. Finally, with mortal switching, the algorithm does not know the connections within the nanocell or locations of the switches, and switching is limited to voltage pulses applied to the input/output pins. An actual physical nanocell is desirably programmed in a mortal fashion and switching will occur only through voltage pulses between contact pads along the periphery. In the simulations presented here, we demonstrate that there are switch states such that a given nanocell functions as a target logic device. Given a certain density of nanoparticles and molecular switches, it is desirable to determine whether any random nanocell can be trained as some target logic device, with the assumption of absolute control over switch states. Some , preliminary strategies for extending the method to mortal switching include taking advantage of the capacitances of the gold particles to better access individual switches. It is believed that a line of molecular switches between two I/O pins, where there is exactly one switch and some capacitance between two gold particles, can be set to any pattern of "on" and "off" states by using these capacitances. The network of molecular switches and gold particles within a nanocell is much more complicated than a simple line of switches between 170 pins; however, simulations indicate that the solution space for some logic gates is quite dense. This implies that it will not be necessary to uniquely access every individual molecule. In fact, if there are multiple switches between two gold particles, then every switch oriented in one direction will switch states simultaneously. However, this should not be a problem because toggling groups of molecules is most likely sufficient. The nanocell training problem with omnipotence is a combinatorial optimization problem where the search space is the set of all possible switch states for some fixed nanocell. If a nanocell contains 250 nanoparticles and about 750 molecular switches in a suitable orientation for switching, then the size of this search space is 2 (as a size comparison, the number of elemental particles in the universe is estimated at 2 3 ). A genetic algorithm is used to search this space. First a random nanocell is generated and a target logic device is defined (such as NAND). The states of the nanocell 's switches are stored as a "chromosome" of "l's" and "O's". An initial generation of random chromosomes is produced. Each chromosome corresponds to a different set of switch states for the nanocell with fixed locations of nanoparticles and molecular switches. A fitness function is formulated such that switch states that cause the nanocell to perform as the target logic device receive low scores while those that do not perform the target logic function receive high scores. The search stops when a chromosome of switch states obtains a score of zero, and thus acceptably performs the desired logic. After the first generation, each generation of new chromosomes is produced by operations performed on the previous generation. Highly fit, or low-scoring, chromosomes combine in pairs to form new and hopefully even better performing chromosomes. In this manner, the space is searched until a chromosome of fitness zero is obtained. Here we present two methods of simulating this omnipotent training process. In order to calculate the fitness of each configuration, or combination of switch states within a nanocell, a series of circuits must be analyzed. Each of these circuits contains a complex network of nonlinear resistors. A pattern of input voltages over time is applied to some of the input/output pins, and the resulting output current over time must be calculated. This involves solving a series of nonlinear, ordinary differential equations. Though solving this system is difficult, the simulations presented here address this in two ways. In the model that we present second, the circuit engineering software, SPICE, is used to analyze each configuration of the nanocell. This software is highly accurate but time consuming, as it is not designed to run iterations of randomly assembled circuits. In the dynamic nanocell model that we present first, the accuracy is sacrificed for the sake of speed; the electrical behavior of the nanocell is approximated so that the complex system of equations is not solved, but a useful approximation can be obtained. The genetic algorithm used is recorded on the attached appendix in file vzNanocell.cpp. Dynamic Nanocell Model Cellular automata (CA) are dynamical system with discrete values for space and time. The states of cells in a regular lattice are updated synchronously according to a deterministic rule relying only on the states of local or neighboring cells [c]. While the state of each cell is often limited to small set of discrete values, it is not uncommon to extend the concept of CA's to permit a real valued state variable [d]. The dynamic nanocell model is a cellular automata in which a hexagonal lattice represents the nanocell and the cells in the lattice represent individual gold nanoparticles. The real valued state variable for a cell is the voltage potential of the nanoparticle and the transition rule for changing the state variable at each time step is to adjust the voltage potential of the nanoparticle to make it Kirchhoff compliant with its neighboring cells. It has been said that computer scientist use cellular automata where physicist's use field theory governed by "field equations" and that using CA's provides an alternative computational approach that may outperform conventional methods by many orders of magnitude [a][b]. We believe that the dynamic nanocell model allows our search algorithms to execute in a timely manner and still accurately model the electrical characteristics of a physical device. The transition rule for the dynamic nanocell model took into account the nonlinearity of the I(V) curve in the NDR devices and allowed the model to simulate electric flow passing through the nanocell, not just fluid flow. This provided the capability to model more interesting logical devices, such as those with negating logic. The dynamic model was evaluated in an incremental fashion as follows. All of the metallic nanoparticles were initialized with a voltage potential of 0, then a non-zero potential was applied to some of the nanoparticles that have been designated as input/output points. The voltage potentials applied to the input points were ramped up incrementally until they reach the levels that represent the Boolean valued input to the nanocell and were then held constant through the simulation. The effected nanoparticles signaled their neighbors that a change has occurred. The nanoparticles then re-evaluated their own potentials by comparing their voltage potential with that of each of their immediate neighbors. The voltage differential of each neighbor along with the I(V) characteristics of the intervening molecular switches determined the amount of current that passes to or from each neighbor. If the sum of the current entering from some neighbors was not equal to the sum of the current that flows out to the remaining neighbors, then the nanoparticle 's voltage potential was adjusted accordingly. If an adjustment was peformed, then neighboring nanoparticles were signaled to re-evaluate their potentials. This process was continued until nanoparticles were satisfied that their entering current were equal to their exiting current, thereby malting the system Kirchhoff-compliant. Finally, the current was calculated at each input/output. Genetic algorithms were used to find a combination of switch settings that make the nanocell behave as a desired logic gate. Since switches were either in an "on" or an "off" state, the chromosome model was a set of bits, at values of 0 or 1, representing the state of all the switches in the cell, "off" or "on", respectively. Hexagonal arrays were used. That is, the nanoparticles were laid down at the corners of triangles, with switches along the sides of the triangles. The genetic algorithm was able to find a combination of switch settings to make a small, 4 4, nanocell act as an XOR device. Further, it has been demonstrated in a "circular" nanocell with a radius of one (that is one central nanoparticle surrounded by an approximately circular perimeter of six nanoparticles) that the nanocell can be trained to fuction as any of the 8 2x1 truth tables (2 inputs, 1 output). Still further, it has been demonstrated in a "circular" nanocell with a radius of two (the above radius-one nanocell surrounded by another approximately circular perimeter of 12 nanoparticles) any of the 64 2x2 truth tables (2 inputs, 2 outputs). This dynamic nanocell model is simple and it executes relatively quickly making it an excellent tool for studying search techniques and logical properties of the nanocell. Each of the following references is hereby incorporated herein by reference: [a] T. Toffoli, N.H.Margolus; "Invertible Cellular Automata: A Review", Cellular Automata: Theory and Experiment, H. Gutowitz, editor; 1991, A Bradford Book, The MIT Press, Cambridge, Massachusetts, London England. [b] T. Toffoli; "Cellular Automata as an Alternative to (Rather than An Approximation of) Differential Equations in Modeling Physics. PHYSICA D, Nonlinear Phenomena, Vol 10D (1984) Nos. 1 & 2, January 1984 [c] H. Gutowitz; "Introduction", Cellular Automata: Theory and Experiment, H. Gutpwitz same as [a] [d] Chopard, Droz; Cellular Automata Modeling of Physical Systems; 1998, Cambridge University Press SPICE Model Spice Model The SPICE model simulates the complex device circuit properties of a nanocell. We configured SPICE to interface with the genetic algorithm described in the previous section. Using Microsoft's COM platform to interface through OLE to Intusoft's ICAPS/4 Windows SPICE variant, a nanocell simulator was developed. Calculations were also performed with HSPICE v. 1999.2 available from Avant. The nanocell simulator randomly generates nanocells and configures them to function as simple logic gates. Given the density and dimensions of the nanoparticles and the average density of the molecular switches, a random nanocell is generated as a hexagonal grid of metallic particles with the specified chosen density. Molecular switches connecting adjacent nanoparticles are distributed following a Poisson distribution based around the given average density (Figure 7). After the creation of a nanocell, the settings on 20 surrounding input/output pins (five pins occupying each of the four sides) are specified. Each input/output pin can be set to input, output, or to float and thus behave like a nanoparticle. Inside the SPICE engine, individual molecules are modeled using nonlinear resistor circuit elements. Achieving convergence in SPICE was resolved by including the parasitic capacitance expected between the nanoparticles. The added capacitance prevents abrupt changes in the current from occurring during simulations, which more realistically models the nanocell architecture and helps with convergence. In the work described here, the logic gates are voltage-input and current-output circuits. When setting the input/output pins to "high" or "low", we let Vπ. and Vm be the low and high voltages for input pins, respectively. When the truth table value of an input is 1, VΓ H volts are applied to this pin. A truth table value of 0 indicates that V Γ volts are applied. Similarly, we set I OL and I O H as the output current thresholds, respectively. If the current through an output pin is at or below I OL , that pin is considered "off", and if the current is at or above I OH , the pin is considered "on". : , Given a number of two-state inputs and outputs, a truth table describes the desired logic. Testing each individual truth is not sufficient. Each transition between truths must be tested as well. Input graphs and corresponding truth tables for an inverter, a NAND gate, and the inverse of a half-adder are displayed in a later section. By parsing the output from SPICE, we determined the output of the nanocell at each clock step. We then compare these readings to I OH and I O to determine if the output pin is "on", "off", or neither (between the discrete threshold settings). In this way, we determined the logic of any given nanocell. By comparing this logic to the desired truth table, we can determine if the nanocell performs the desired logic function. For a fixed nanocell it is desirable to search among all possible combinations of switch states, where the location of each switch is fixed. In other words, a new switch cannot be added between nanoparticles, and existing switches cannot be removed. Only the switch states can be altered. In the SPICE model, pin settings and "on" and "off" current thresholds (I OL and I OH ) were constant. The objective was to fix these parameters such that any random nanocell, of a particular nanoparticle and molecular switch density, can be trained as some target logic gate. Exemplary setting were determined for inverters, NAND gates and inverse half-adders. A representative SPICE listing of an exemplary nanocell in an unprogrammed state is recorded on the attached APPENDIX in file Trained Nanocell.doc. The "on"-"off" states of the molecular switches of the unprogrammed nanocell is shown in Figure 7. A representative SPICE listing a the same nanocell reprogrammed to function as an Inverter is recording on the attached APPENDIX in file Trained Nanocell.doc. The "on"-"off" states of the nanocell functioning as a programmed Inverter are shown in Figure 8. A representative SPICE listing of the same nanocell programmed to function as a NAND gate is recorded on the attached APPENDIX in file Trained Nanocell.doc. The "on"- "off" states of the nanocell functioning as a programmed NAND are shown in Figure 9. A representative SPICE listing of the same nanocell programmed to function as a Inverse Half Adder is recorded on the attached APPENDIX in file Trained Nanocell.doc. The "on"-"off" states of the nanocell functioning as a programmed Inverse Half Adder are shown in Figure 10. The above-described results demonstrate the programmable and reprogrammability of the exemplary nanocell shown in Figure 7. While preferred embodiments of this invention have been shown and described, modifications thereof can be made by one skilled in the art without departing from the spirit or teaching of this invention. The embodiments described herein are exemplary only and are not limiting. Many variations and modifications of the device, computer, and methods are possible and are within the scope of the invention. Accordingly, the scope of protection is not limited to the embodiments described herein, but is only limited by the claims that follow, the scope of which shall include all equivalents of the subject matter of the claims. APPENDIX PAGES 60 -224 ATTACHED APPENDIX adjust.cpp /* ' ' **** ** ***** * ** ** ** * ******************************************** * * * * ***** * *** adjust.cpp Van Zandt * * *•* *************************************************************** ********* */ #include "vzComputer .h" void mainO { vzNanoCell *myCell; mγCell= new vzNanoCell; StartGraphi-cs ( ) ; SetTi er (0 ) ; myCell->DoCreate (5,4,30,30,80,90); ' myCell->SetInReg (" 00100 ") ; myCell->SetOutReg(" 00000") ; myCell->DoDraw() ; read ey( ) ; rectfill (screen, 0,0, 5, 5, HITE) ; myCell->DoAdjust ( ) ; rectfill (screen, 0, 0, 5, 5, BLACK) ; readkey( ) ; delete myCell ; StopGrap ics ( ) ; return 0 ; ***************************************************************** ********* conduc . cpp /* ******************************************************************* ********* conduct . cpp Van Zandt * ****************** **************** * ******************************* ********* * #include "vzComputer .h" void main() { vzNanoCell *myCell; myCell= new vzNanoCell; StartGraphics ( ) ; SetTimer (5) ; myCell->DoCreate(5,9,30,30,75,75) ; myCell->SetInReg(" 01000") ; myCell->SetOutReg(" 01010") ; myCell->DoDraw( ) ; readkey ( ) ; yCell->DoConduct ( ) ; readkey( ) ; delete myCell; StopGraphics ( ) ; return 0; } //***************************************************************** ********* dra . cpp /* *************************************************************** Draw . cpp Van Zandt ** ****** ******************** ************* ******** ************** * / # include "vzComputer .h" void main( { StartGraphics ( ) ; line (screen, 50, 50, 70, 70, HITE) line (screen, 51,50, 71 , 70 , HITE) line (screen, 52 , 50 , 72 , 70 ,WHITE) circlefill (screen, 50, 50, 10, RED) ; circlefill (screen, 70,70, 10 ' , RED) ; line (screen, 50 , 150 , 70 , 170 ,WHITE) ; circlefill (screen, 50 , 150 , 10 , IGHTRED) ; circlefill (screen, 70,170,10, IGHTRED) ; readkey( ) ; StopGrap ics ( ) ; flood. cpp /* ******************************************************************* ********* flood . cpp Van Zandt ** ** * ** ** ** ************************************** * * ********* ******* ********* */ tinclude "vzComputer .h" ' void main() { vzNanoCell *myCell; yCell= new vzNanoCell; StartGraphics ( ) ; SetTimer (1) ; myCell->DoCreate (5,4,30,30,80,80); myCell->SetInReg ( "00100" ) ; myCell->SetOutReg ( " 01010 " ) ; myCell->DoDraw() ; save_bitma ( "floodl .bmp" , screen, desktop_palette) ; readkey ( ) ; //myCell->DoAdjust ( ) ; / / yCell->DoDraw ( ) ; myCell->DoFlood() ; save_bitma ( "flood2.bmp" , screen, desktop_palette) ; readkey ( ) ; delete myCell; StopGraphics ( ) ; return 0; ***************************************************************** ********* gal . cpp /* ******************************************************************* ********* gal . cpp Van Zandt ** * * ** *** **** ****************************** ************************ ********* * #include "vzComputer .h" #include "vzPopulation .h" tinclude <iostream.h> vzNanoCell *myCell ; double theEvaluator (vzlndividual *iPtr) ; void main ( ) { ■ " * ■ int i; char buffer [80] ; vzPopulation *myPopulationPtr; StartGraphics ( ) ; myCell= new vzNanoCell; SetTimer ( 0 ) ; myCell->DoCreate(5,4,30,30,80,90) ; myPopulationPtr = new vzPopulation (500, myCell->GetSwitchCo unt(), 2, theEvaluator); myCell->DoClear ( ) ; myCell->SetInReg(" 00100") ; myCell->SetOutReg(" 00000") ; myCell->DoDraw() ; readkey( ) ; myCell->DoFlood( ) ; save_bitmap ( "floodl .bmp" , screen, desktop_palette) ; readkey ( ) ; rectfill (screen, 0,0, SCREEN_W, SCREEN_H, HITE) ; myPopulationPtr->BuildRandom() ; myPopulationPtr->ReGenerate(100) ; readkey ( ) ; gal . cpp rectfill (screen, 0,0, SCREΞN_W, SCREEN_H, BLACK) ; myCell->DoClear() ; myCell->SetInReg{ "00100" ) ; myCell->SetOutReg("00000") ; myCell->LoadSwitch(myPopulationPtr-> GetlndividualPtr (my PopulationPtr->SelectBest ( ) ) -> GetChromosomePtr ( ) ) myCell->DoDraw() ; readkey ( ) ; myCell->DoFlood ( ) ; save_bitmap ( "flood2.bmp" , screen, desktop_palette) ; readkey ( ) ; StopGraphics { ) ; delete myPopulationPtr; delete myCell; return 0 ; } double theEvaluator (vzlndividual *iPtr) { static int i = 0 ; char buffer [80]; double t pFitness; double totFitness = 0.0; myCell->DoClear ( ) ; myCell->LoadSwitch(iPtr->GetChromosomePtr () ) ; myCell->SetInReg(" 00100") ; myCell->SetOutReg (" 00000" ) ; myCell->DoAdjust ( ) ; tmpFitness = (double)myCell->GetPinPtr (out, 0) ->GetPinDistan ce(in, 2) ; if ( tmpFitness == -1.00 ) tmpFitness = 0.00; else tmpFitness = 1000.0 - tmpFitness; totFitness += tmpFitness; tmpFitness = (double)myCell->GetPinPtr (out, 1) ->GetPinDistan ce(in, 2) ; if ( tmpFitness == -1.00 ) tmpFitness = 0.00; else tmpFitness = 1000.0 - tmpFitness; gal . cpp totFitness += tmpFitness; tmpFitness = (double)myCell->GetPinPtr (out, 3 ) ->GetPinDistan ce(in,2) ; if ( tmpFitness == -1.00 ) tmpFitness = 0.00; else tmpFitness = 1000.0 - tmpFitness; totFitness += tmpFitness; tmpFitness = (double)myCell->GetPinPtr (out, 4) ->GetPinDistan ce(in,2) ; if ( tmpFitness == -1.00 ) tmpFitness = 0.00; else tmpFitness = 1000.0 - tmpFitness; totFitness += tmpFitness; tmpFitness = (double) yCell->GetPinPtr (in, 1) ->GetPinDistanc e(in,2; if ( tmpFitness == -1.00 ) tmpFitness = 0.00; else tmpFitness = 1000.0 - tmpFitness; totFitness += tmpFitness; tmpFitness = (double)myCell->GetPinPtr (in, 3 ) ->GetPinDistanc e(in,2) if ( tmpFitness == -1.00 ) tmpFitness = 0.00; else tmpFitness = 1000.0 - tmpFitness; totFitness '+= tmpFitness; // tmpFitness = (double)myCell->GetPinPtr (out, 2) ->GetPinDistan ce(in,2); if ( tmpFitness == -1.00 ) tmpFitness = 1000.00; else if ( tmpFitness < 50 ) tmpFitness = 0.00; else tmpFitness = tmpFitness - 50; totFitness += tmpFitness; tmpFitness = (double)myCell->GetPinPtr (in, 0) ->GetPinDistanc e(in,2) if ( tmpFitness == -1.00 ) tmpFitness = 1000.00; else if ( tmpFitness < 50 ) tmpFitness = 0.00; else tmpFitness = tmpFitness-- 50; totFitness += tmpFitness; tmpFitness = (double)myCell->GetPinPtr (in, 4) ->GetPinDistanc e(in,2) if ( tmpFitness == -1.00 ) tmpFitness = 1000.00; else if ( tmpFitness < 50 ) tmpFitness = 0.00; else tmpFitness = tmpFitness - 50; totFitness += tmpFitness; gal . cpp sprintf (buffer, "%d: %f",i++, totFitness) textout (screen, font, buffer, 5, 5, BLACK) ; return totFitness; /***************************************************************** ********* parity. cpp /* ************************************************************ parity. cpp Van Zandt ************************************************************ */ #include "vzClassifier.h" int gClassifierSetSize = 100; double gGeneralTaxRate = .01; double gBadMatchTaxRate = .10; double gHonorariumRate = .0; int gMutationPerlOOO = 100; int gTournamentSize = 100; int gTournamentCount = 10; int gRegeneratePerlOOO = 1000; int main ( ) { vzClassSystem myClass ( gClassifierSetSize, gGe neralTaxRate, gBa dMatchTaxRate, gHo norariumRate , gMu tationPerlOOO, gTo urnamentSize, gTo urnamentCount , gRe generatePerlOOO ) ; vzVector<int> SO (3) ; vzVector<int> Sl(3) vzVector<int> S2(3) vzVector<int> S3 (3) vzVector<int> S4(3) vzVector<int> S5(3) vzVector<int> S6(3) vzVector<int> S7(3) vzVector<int> Solution (8) int i; parity. cpp int maxCycle = 1000; int theScore; S0[0] = 0 S0[1] = 0 S0[2] = 0; Solution [0] = 1; S1[0] = 0; Sl[l] = 0; Sl[2] = 1; Solution [1] = 0; S2[0] = 0; S2[l] = 1; S2[2] = 0, Solution [2] = 0; S3[0] = 0; S3[l] = 1; S3[2] = 1; Solution [3] = 1; S4[0] = 1; S4[l] = 0; S4[2] = 0; Solution[4] = 0; S5[0] = 1; S5[l] = 0; S5[2] = 1; Solution [5] = 1; S6[0] = 1 S6[l] = 1 S6[2] = 0 Solution [6 1; S7[0] = 1 S7[l] = 1 S7[2] = 1 Solution [7 ] = 0; for (i=0; i<maxCycle; i++) { theScore = 0 ; parity.cpp if Solutio [0] == myClass .GetMov (SO) ) { theScore++; myClass .ApplyReward( 1000) if Solution [1] == myClass.GetMove (SI) ) { theScore++; myClass .ApplyReward(lOOO) if Solutio [2] == myClass .GetMove (S2) ) { theScore++; myClass .ApplyReward(1000) if Solution [3] == myClass .GetMove (S3) ) { theScore++; myClass .ApplyReward(1000) if Solution [4] == myClass .GetMove (S4) ) { theScore++; myClass .ApplyReward(1000) if Solution [5] == myClass .GetMove (S5) ) { theScore++; myClass .ApplyReward (1000) if Solution [6] == myClass .GetMove (S6) ) { theScore++; myClass .ApplyReward(1000) if Solutio [7] == myClass .GetMove (S7) ) { theScore++; myClass.ApplyReward(1000) cout « 1 « « theScore « endl; doPause(lO) ; return 0 ; plot. cpp *************************************************************** Plot . cpp Van Zandt *************************************************************** */ #include <math.h> #include "vzComputer.h" void main( ) ' { double x, y; int i ,- StartGraphics ( ) ; int yBorder = 20; int X0 = SCRΞEN_W/2; int Y0 = SCREEN_H/2; line (screen, X0, Y0- (Y0-myBorder) ,X0, Y0+(Y0-myBorder) , HITE) ; line (screen, 0- (X0-myBorder) , 0,X0+ (X0-myBorder) ,Y0,WHITE) ; for ( i=-75; i<=75; i+=2 ) { x = i + 0.00; y = 150.0 * sin( (x*PI)/50.0) ; if ( x*PI/50.0 > PI/2 && y < 50.0 ) y = 50.0; if ( x*PI/50.0 < -PI/2 && y >-50.0 ) y = -50.0; circlefill (screen, X0+( (int)x*4) ,Y0- (int)y, 3 ,RED) ; x = i + 1.00; y = 150.0 * sin((x*PI)/50.0) ; if ( (x > 0.0 && y > ' 50.0) j | x*PI/50.0 > PI/2 ) y = 50.0; if ( (x < 0.0 && y < -50.0) | | x*PI/50.0 < -PI/2 ) y = '-50.0 ; circlefill (screen, X0+( (int)x*4) ,Y0- (int)y, 3 , IGHTRED) ; } εave_bitma ( "plot .bmp" , screen, desktop_palette) ; readkey( ) ; StopGraphics ( ) ; plot . cpp ptes .cpp * ptest. cpp Van Zandt */ #include <iostream.h> #include <conio.h> #include <math. > #include "vzTools.h" int PoissonRando (double expectedvalue) ; void main ( ) { int k = 5; int i; int n; int result [20] ; double sum = 0.0; for ( i=0; i<20; i++ )■ result [i] = 0; for ( i=0; i<1000; i++ ) { n = PoissonRando ( (double) k) ; result [n] ++; sum += n; } for ( i=0; i<20; i++ ) cout « i «'\t' « result [i] « endl; cout « endl « endl « sum/1000.0 « endl; getch ( ) ; } int PoissonRandom(double expectedvalue) { int n = 0; double limit; double x; limit = exp (-expectedvalue) ; x = getRandom(1000000)/1000000.0; ■ while ( x > limit ) { n++; x *= getRandom(1000000)/1000000.0; ptest. cpp } return n; Run . cpp /* ******************************************************************* ********* vzRun . cpp Van Zandt ******************************************************************* ********* */ # include "vzCo puter .h" void main ( ) { vzNanoCell *myCell; myCell= new vzNanoCell; StartGraphics ( ) ; SetTimer (0) ; myCell->DoCreate (5,9,30,30,75,75); //myCell->SetInReg("01000") ; //myCell->SetOutReg(" 01010") ; myCell->DoDraw( ) ; readkey ( ) ; myCell->DoAdjust ( ) ; //myCell->DoDraw( ) ; readkey ( ) ; delete myCell; StopGraphics ( ) ; return 0; //***************************************************************** ********* theSimulator. cpp /* ******************************************************************* ********* theSimulator. cpp Van Zandt ******************************************************************* ********* */ #include "vzComputer .h" #include "vzPopulation.h" vzNanocell *myCell; double theEvaluatorl (vzlndividual *iPtr) double theEvaluator2 (vzlndividual *iPtr) double doScore(int n, bool IsItAnd) ; mt doNew( ) ;. int doClear ( ) ; int doRun ( ) ; int doAbout ( ) ; int doExit ( ) ; int doSetlOOOOO int doSet01000() int doSetllOOOO int doStore ( ) ; int doLoad( ) ; int doPaint ( ) ; int doSelect ( ) ; int doTrainAND ( ) ; int doTrainOR( ) ; int doGetAND ( ) ; ■ int doGetOR ( ) ; int doClassifierANDO ; MENU theFileMenu[] = { "Load doLoad, NULL, NULL "Store doStore, NULL, NULL "Paint doPaint, NULL, NULL "Select doSelect, NULL, NULL NULL, NULL, theSimulator. cpp NULL }, "Exit doExit, NULL, NULL } }; MENU theTrainMenu [ ] = { { "AND doTrainAND, NULL, NULL }, { "OR / doTrainOR, NULL, NULL }, { / NULL, NULL, NULL } , { "AND Circuit", doGetAND, - NULL, NULL }, { "OR Circuit", doGetOR, NULL, NULL }, { t NULL, NULL, NULL }, { "AND Classifier ", doClassifierAND, NUL L, NULL } }; MENU theMenu [ ] = { { "File NULL, theFileMenu / NULL }, { "Train NULL, theTrainMen u, NULL }, { The Nanocell Simu lator", doAbout, NULL, NULL } }; MENU theRunMenu [ ] = { { "New doNew, NULL, NULL }, { "Run doRun, NULL, NULL }, { • "Clear doClear, NULL, NULL }, { / NULL, NULL, NULL }, { "Set[10000] ", doSetlOOOO, NULL, NULL }, { "Set [01000] ", doSetOlOOO, NULL, NULL theSimulator.cpp }, "Set[11000] doSetllOOO, NULL, NUL L }; DIALOG the_dialog[] = { /* (dialog proc) (x) (y) (w) (h) (fg) (bg) (key) ( flags) (dl) (d2) (dp) (dp2) (dp3) */ { d box_proc, o, o, 639, 479, 255, 4, 0, 0 0, 0, NULL, NULL, NULL }, { d box_proc, 12, 12, 615, 455, 8, 6, 0, 0 0, 0, NULL, NULL, NULL }, { d menu_proc, 12, 13, 0, 0, 0, 0, 0, 0 0, 0, (void *)theMenu, NULL, NULL }, { d menu_proc, 12, 454, 0, 0, 0, 0, 0, 0 0, 0, (void * ) theRunMenu, NULL, NULL }, { NULL, 0, 0, 0, 0, 0, 0, 0, 0 0, 0, NULL, NULL, NULL } }; int main ( ) { StartGraphics ( ) ; SetTimer (0]i ; TraceOff () ;r do_dialog(the_dialog, -1) ; if ( myCell != NULL ) delete myCell; StopGraphics () ; return 0 ; mt doNew ( ) { show_mouse (NULL) ; if ( myCell != NULL ) delete myCell; myCell= new vzNanocell; theSimulator.cpp myCell->DoCreate (5,4,30,30,85,90); myCell->DoDraw ( ) ; show_mouse (screen) ; return D_0_K; int doAbout ( ) { char strl[] = "The Nanocell Simulator"; char str2[] = "by Bill Van Zandt"; char str3[] = "and Eric Libby" ; alert (strl, str2 , str3, "OK" ,NULL, 0, 0) ; return D_0_K; int doClear ( ) { ' int i ; char msg [20] = " char buffer[40] = " if ( myCell != NULL ) { show_mouse (NULL) ; text_mode(CYAN) ; for (i=0; i<myCell->GetPinNum() ; i++) { textou (screen, font, msg, 540,myCell->PinH eight (i) , BLACK) ; textout (screen, font, msg, 540,myCell->PinHeight (i) +10, BLACK) ; textout (screen, font, msg, 15, myCell->PinH eight (i) , BLACK) ; textout (screen, . font, msg, 15, myCell->PinHeight (i) +10, BLACK) ; > textout (screen, font,buffer, 20, 440, BLACK) ; TraceOn ( ) ; myCell->ClearCell ( ) ; theSimulator . cpp TraceOf f ( ) ; show_mouse ( screen) ; } else { show_mouse ( ULL) rectfill (screen, 25,25, 615 , 445 , CYAN) ; show_mouse (screen) ; } return D_0_K; int doRun ( ) { int i; int flow; char msg [20] ; if ( myCell != NULL ) { show_mouse (NULL) ; text_mode(CYAN) ; myCell->DoFlow( ) ; for (i=0; i<myCell->GetPinNum( ) ; i++) { flow=0; flow=myCell->GetInitialFlow(false, i) ; sprintf(msg, "init = %d" , flow); textout (screen, font, msg, 540,myCell->PinH eight (i) , BLACK) ; flow=myCell->GetFlow(false, i) ; sprintf(msg, "flow = %d" , flow) ; textout (screen, font, msg, 540,myCell->PinHeight (i) +10, BLACK) ,• flow=myCell->GetInitialFlow(true, i) ; sprintf(msg, "init = %d", flow) ; textout (screen, font, msg, 15, myCell->PinH eight (i) , BLACK) ; theSimulator . cpp flow=myCell->GetFlow(true, i) ; sprintf(msg, "flow = %d" , flow) ' ; textout (screen, font, msg, 15,myCell->PinHeight (i) + 10, BLACK) ; myCell->Drawpaths ( ) } show_mouse{screen) ; } return D_0_K; int doSelect ( ] { char path [81] ; file_select( "Select File", path, NULL) ; doClear ( ) ; return D_0_K; int doSetlOOOOO { char msg [20] ; if ( myCell != NULL ) { doClear ( ) ; show_mouse(NULL) ; text_mode(CYAN) ; TraceOn ( ) ; myCell->SetPin(true, 0, kStartFlow); sprintf(msg, "flow = %-5d" , kStartFlow); textout (screen, font, msg, 16, yCell->PinHeight (0) , BLACK) ,• myCell->DeactivatePin(true, 1) myCell->DeactivatePin(true, 2) myCell->DeactivatePin(true, 3) theSimulator . cpp myCell->DeactivatePin (true, 4) ; TraceOf f ( ) ; show_mouse ( screen) ; } return D_0_K; int doSet01000() { char msg [20] ; if ( myCell != NULL ) { doClear ( ) ; show_mouse (NULL) ; text_mode(CYAN) ; TraceOn( ) ; myCell->SetPin(true, 1, kStartFlow); sprintf(msg, "flow = %-5d" , kStartFlow); textout (screen, font, msg, 16,myCell->PinHeight (1) , BLACK) ; myCell->DeactivatePin(true, 0) myCell->DeactivatePin(true, 2) myCell->DeactivatePin(true, 3) myCell->DeactivatePin(true, 4) TraceOff () ; show_mouse (screen) ; } return D_0_K; int doSetllOOOO { char msg [20] ; if ( myCell != NULL ) { doClear ( ) ; show_mouse (NULL) ; theSimulator.cpp text_mode ( -1) ; TraceOn ( ) ; myCell->SetPin(true, 0, kStartFlow); sprintf(msg, "flow = %-5d", kStartFlow); textout (screen, font, msg, 16,myCell->PinHeight (0) , BLACK) ,• myCell->SetPin(true, 1, kStartFlow) ; sprintf(msg, "flow = %-5d", kStartFlow); textout (screen, font, msg, 16,myCell->PinHeight (1) , BLACK) ; myCell->DeactivatePin(true, 2) ; myCell->DeactivatePin(true, 3) ; myCell->DeactivatePin(true, 4) ; TraceOff () ; show_mouse (screen) ; > return D_0_K; int doStore ( ) { if ( myCell != NULL ) myCell->DoStore ( "Nanocell . out" ) ; return D_0_K; int doLoad ( ) { show_mouse (NULL) ; doClear ( ) ; ' if ( myCell != NULL ) delete myCell; myCell = new vzNanocell; myCell->DoLoad( "Nanocell. out") ; myCell->DoDraw ( ) ; show_mouse ( screen) ; theSimulator . cpp return D_0_K; int doGetAND ( ) { show_mouse (NULL) ; doClear ( ) ; if ( myCell != NULL ) delete myCell; myCell = new vzNanocell; myCell->DoLoad( "Nanocell . and" ) ; myCell->DoDraw() ; show_mouse (screen) ; return D_0_K; int doGetOR( ) { show_mouse (NULL) ; doClear ( ) ; if ( myCell != NULL ) delete myCell; myCell = new vzNanocell; myCell->DoLoad( "Nanocell. or") ; myCell->DoDraw ( ) ; show_mouse (screen) ; return D_0_K; int doPaint ( ) { char buffer[40]; static int bmp = 1; theSimulator.cpp sprintf (buffer, "mcPaint%d.bmp" , bmp) ; save_bitmap (buffer, screen, desktop_palette) ; bmp++; return D_0_K; int doTrainAND ( ) { vzPopulation *myPopulationPtr; if myCell != NULL ) { doClear ( ) ; TraceOff ( ) ; myPopulationPtr = new vzPopulation ( 20, //mkTournamentCount 32, //mkTournamentSize 400, //mkMutate 500, //mkCrossover 100, //mkRandom, 50, //mkCount myCell->GetSwitchCo unt ( ) , //mkSize 2, //mkAlphabetCount the Evaluator2 ) //Evaluation Ptr myCell->ClearCell ( ) ; myPopulationPtr->BuildRandom() ; myPopulationPtr->ReGenerate (50) ; myCell->ClearCell ( ) ; myCell->LoadSwitch(myPopulationPtr-> GetlndividualPtr (myPopulationPtr->S electBest ι GetChromosomePtr ( ) ) ; theSimulator . cpp delete myPopulationPtr; } return D_0_K; int doTrainOR( ) { vzPopulation *myPopulationPtr; if ( myCell != NULL ) { doClear ( ) ; TraceOff ( ) ; ' myPopulationPtr = new vzPopulation ( 20, //mkTournamentCount 32, //mkTournamentSize 400, //mkMutate 500, //mkCrossover 100, // kRandom, 50, //mkCount mmyyCell->GetSwitchCo unt ( ) , //mkSize 2, //mkAlphabetCount the Evaluatorl) ; //Evaluation Ptr yCell- ->ClearCell() ; ' myPopulationPtr->BuildRandom() ; myPopulationPtr->ReGenerate (10) ; TraceOn{ ) ; myCell->ClearCell ( ) ; TraceOff () ; myCell->LoadSwitch (myPopulationPtr-> GetlndividualPtr (myPopulationPtr->S electBest () ) -> GetChrpmosomePtr ( ) ) ; theSimulator.cpp delete myPopulationPtr; } return D_0_K; int doExit ( ) { return D_CLOSE; } double theEvaluatorl (vzlndividual *iPtr) { static int i = 0; char buffer [80]; int tmpFlow; double totFitness = 0.0; text_mode(CYAN) ; myCell->LoadSwitch (iPtr->GetChromosomePtr ( ) myCell->ClearCell ( ) ; myCell->SetInReg(" 10000") ; myCell->SetOutReg ("*****") ; myCell->DoFlow ( ) ; totFitness += doScore(0, false); myCell->ClearCell () ; myCell->SetInReg(" 01000") ; • myCell->SetOutReg ("*****") ; myCell->DoFlow( ) ; totFitness += doScored, false); myCell->ClearCell ( ) ; myCell->SetInReg( "11000") ; myCell->SetOutReg( "*****" ) ; myCell->DoFlow( ) ; totFitness += doScore(2, false); sprintf (buffer, "%d: %f",i++, totFitness) textout (screen, font, buffer, 20, 440, BLACK) ; if (totFitness==0) i=0; theSimulator.cpp return totFitness; } double theEvaluator2 (vzlndividual *iPtr) { static int i = 0; char buffer [80]; int tmpFlow; double totFitness = 0.0; text_mode(CYAN) ; myCell->LoadSwitch(iPtr->GetChromosomePtr () ) ; myCell->ClearCell ( ) ; myCell->SetInReg(" 10000") ; myCell->SetOutReg ("*****") ; myCell->DoFlow ( ) ; totFitness += doScore(0, true); myCell->ClearCell ( ) ; myCell->SetInReg(" 01000") ; myCell->SetOutReg ( » ***** » ); myCell->DoFlow ( ) ; totFitness += doScore(l, true) ; myCell->ClearCell ( ) ; myCell->SetInReg(" 11000") ; myCell->SetOutReg ( « ***** « ); myCell->DoFlow() ; totFitness += doScore(2, true) ; sprintf (buffer, "%d: %f",i++, totFitness); textout (screen, font, buffer, 20, 440, BLACK) ; if (totFitness==0) i=0; return totFitness; double doScore(int n, bool IsItAnd) { // AND: in("??***") —> out("?**** ,τ ; theSimulator. cpp int tmpFlow; double retFitness = 0.0; if (IsItAnd) { switch (n) { case 0: // in ("10000") case 1: // in ("01000") tmpFlow = myCell->GetPinPtr (out, 0) - >GetFlow(true) ; if ( tmpFlow <= kLowFlow ) retFitness += 0.00; else retFitness. += (double) (tmpF low - kLowFlow) break; case 2: // in ("11000") tmpFlow = myCell->GetPinPtr (out, 0) - >GetFlow(true) ; if ( tmpFlow >= kHighFlow ) retFitness += 0.00; else retFitness += (double) (kHig hFlow - tmpFlow) break; } tmpFlow = myCell->GetPinPtr (out, 1) ->GetFlow(true) ; if ( tmpFlow <= kLowFlow ) retFitness += 0.00; else retFitness += (double) (tmpFlow - kLowFlow) ; tmpFlow = myCell->GetPinPtr (out;2) ->GetFlow(true) ; if ( tmpFlow <= kLowFlow ) retFitness += 0.00; else retFitness += (double) (tmpFlow - kLowFlow) ; tmpFlow = myCell->GetPinPtr (out, 3) ->GetFlow(true) ; if ( tmpFlow <= kLowFlow ) retFitness- += 0.00; else retFitness += (double) (tmpFlow - kLowFlow) ; tmpFlow = myCell->GetPinPtr (out, 4) ->GetFlow(true) ; if ( tmpFlow <= kLowFlow ) retFitness += 0.00; theSimulator. cpp else retFitness += (double) (tmpFlow - kLowFlow) ; else { switch (n) { case 0 // inC'10000") case 1 // inC'01000") case 2 // inC'11000") tmpFlow = myCell->GetPinPtr (out, 0) ->GetFlow (true) if ( tmpFlow >= kHighFlow ) retFitness += 0.00; else retFitness += (double) (kHighFlow - tmpFlow) break; tmpFlow = myCell->GetPinPtr (out, 1) ->GetFlow(true) ; if ( tmpFlow <= kLowFlow ) retFitness += 0.00; else retFitness += (double) (tmpFlow - kLowFlow) ; tmpFlow = myCell->GetPinPtr (out, 2) ->GetFlow(true) ; if ( tmpFlow <= kLowFlow ) retFitness += 0.00; else ' retFitness += (double) (tmpFlow - kLowFlow) ; tmpFlow = myCell->GetPinPtr (out, 3) ->GetFlow(true) ; if ( tmpFlow <= kLowFlow ) retFitness +- 0.00; else retFitness += (double) (tmpFlow - kLowFlow) ; tmpFlow = myCell->GetPinPtr (out, 4) ->GetFlow(true) ; if ( tmpFlow <= kLowFlow ) retFitness += 0.00; else retFitness += (double) (tmpFlow - kLowFlow) ; } . return retFitness; theSimulator . cpp int doClassifierAND ! { return D_0_K; vzGrid. cpp /* ******************************************************************* ******* vzGrid. cpp Van Zandt ************ * ** ********* ************************** **** * ***** **** ** * ******* */ vzGrid: :vzGrid ( ) { } vzGrid: : -vzGrid ( ) { } void vzGrid: :DoCreate (int NumConn, int NumSwit) { mNumConn=NumConn; mNumSwit=NumSwit; mBoxHeight=190/ (2*mNumConn) ; mBoxWidth=320/ (2*mNumSwit) ; mCount=-l; } void vzGrid: :DoDraw(int CurrentConn, int CurrentSwit, int Successva 1) { int x,y; x=CurrentConn; y=CurrentSwit; mCount++; if ( (Successval>=90)&&(Successval<100) ) box (mBoxWidth*2*x+5 , 2*y*mBoxHeight+l0 ,mBoxWidth* (2* x+l)+5, mBoxHeight*(2*y+l)+10,RED,FILLED) ; if ( (Successval>=80)&&(Successval<90) ) box(mBoxWidth*2*x+5 , 2*y*mBoxHeight+l0 ,mBoxWidth* (2* x+l)+5, mBoxHeight* (2*y+l) +10 ,MAGENTA, FILLED) ; if ( (Successval>=70)&&(Successval<80) ) box (mBoxWidth*2*x+5 , 2*y*mBoxHeight+10 ,mBoxWidth* (2* x+l)+5, vzGrid . cpp mBoxHeight* (2*y+l) +10,YELLOW, FILLED) ; if ( (Successval>=60) && (Successval<70) ) box (mBoxWidth*2*x+5, 2*y*mBoxHeight+10,mBoxWidth* (2*' x+l)+5, mBoxHeight* (2*y+l) +10 , GREEN, FILLED) ; if ( (Successval>=50) &&(Successval<60) ) box (mBoxWidth*2*x+5 , 2*y*mBoxHeight+10 ,mBoxWidth* (2* x+l)+5, mBoxHeight* (2*y+l) +10, CYAN, FILLED) ; if ( (Successval<50) ) box (mBoxWidth*2*x+5, 2*y*mBoxHeight+10,mBoxWidth* (2* x+l)+5, mBoxHeight* (2*y+l) +10 , BLUE, FILLED) ; if (Successval==100) bo (mBoxWidth*2*x+5 , 2*y*mBoxHeight+10 ,mBoxWidth* (2* x+l)+5, mBoxHeight* (2*y+l) +10,WHITE, FILLED) ; } vzGrid. h /* ************************************************* ***** vzGrid. h - - Van Zandt ******************************************************************* ***** */ #if ! defined (_vzGrid_h) #define _vzGrid_h #include <conio.h> class vzGrid { private : int mBoxHeight; int mBoxWidth; int mNumSwit; int mNumConn; int mCount; public: vzGrid ( ) ; -vzGrid ( ) ; void DoCreate(int Nu Conn, int NumSwit) ; void DoDraw(int CurrentConn, int CurrentSwit^ int Successva 1); }; #include "vzGrid.cpp" #endif // _vzGrid_h vzPercolation.cpp * ******************************************************************* ********* vzPercolation. cpp Van Z.andt ******************************************************************* ********* */ const int kRegisterWidth=15; #include "vzNanoCell.h" #include <iostream.h> #include "vzGrid.h" vo •id main ( ) { int connx; int swity; float success; int i; . int testnum; vzGrid myGrid; vgainit ( ) ; cis (BLACK) ; testnum=l; i=-l; x=-l; vzNanoCell *myCell ; myGrid.DoCreate (30,30); for (connx=40 ; connx<101; connx=connx+2 ) { x++; y=-i; for (swity=40;swity<101;swity=swity+2) { y++ ; success=0; i++; for (p=0;p<testnum;p++) vzPercolation.cpp myCell= new vzNanoCell; myCell->DoCreate(4,3,40,40,connx, swity) ; myCell->DoLoad("1000") ; myCell->DoFlood() ; if (myCell->DoCheck() ) success++; delete myCell; myCell= new vzNanoCell; myCell->DoCreate(4, 3 , 40, 40, connx, swity) ; myCell->DoLoad("0100") ; myCell->DoFlood() ; if (myCell->DoCheck( ) ) success++; delete myCell; myCell= new vzNanoCell; myCell->DoCreate(4,3, 40, 40, connx, swity) ; myCell->DoLoad("0010") ; myCell->DoFlood( ) ; if (myCell->DoCheck() ) success++; delete myCell; myCell= new vzNanoCell; myCell->DoCreate(4, 3 , 40, 40, connx, swity) ; myCell->DoLoad("0001") ; myCell->DoFlood() ; if (myCell->DoCheck() • ) success++; delete myCell; } myGrid. DoDraw(x,y, success/testnum*25.00) ; vzPercolation. cpp getch ( ) ; vgaexit ( ) return 0; //***************************************************************** ********* vzClassifier.cpp /* ******************************************************************* ******* Van Zandt vzClassifier . cpp ******************************************************************* ******* */ vzClassifier : :vzClassifier ( int kClassifierSetSize, dou ble kGeneralTaxRate, dou ble kBadMatchTaxRate, dou ble kHo ' norariumRate, int kMutationPerlOOO , int kTournamentSize, int kTournamentCount, int kRegeneratePerlOOO ) mClassifierSetSize (kClassifierSetSize) , mGeneralTaxRate (kGeneralTaxRate) , mBadMatchTaxRate (kBadMatchTaxRate) , mHonorariumRate (kHonorariumRate) , mMutationPerlOOO (kMutationPerlOOO) , mTournamentSize (kTournamentSize) , mTournamentCount (kTournamentCount) , mRegeneratePerlOOO (kRegeneratePerlOOO ) mClassifierSet . resize (mClassifierSetSize) ; mMatchSet.resize (mClassifierSetSize) ; mActionSet .resize (mClassifierSetSize) ; mOldActionSet . resize (mClassifierSetSize) ; //BuildRandom( ) ; mMatchSize = 0; ActionSize = 0; mOldActionSize = 0; vzClassifier.cpp void vzClassifier: :PrintvzClassifiers (ofstream out) { int i ; for (i=0; i<kvzClassifierSetSize; i++) { out « i « " :--> " ; mClassifierSet[i] . PrintToFile (out) ; } } */ void vzClassifier: :BuildMatchSet (vzVector<int> theSensor) { int i ; mMatchSize = 0; for (i=0; i<mClassifierSet. length( ) ; i++) if ( mClassifierSet[i] .IsMatch(theSensor) ) { mMatchSet [mMatchSize] = i; mMatchSize++; } if ( mMatchSize == 0 ) { i = BuildCover (theSensor) ; mMatchSet [mMatchSize] = i; mMatchSize++; int vzClassifier ::GetMove (vzVector<int> theSensor) { BuildMatchSet (theSensor) ; return BuildActionSet ( ) ; } int vzClassifier: :BuildCover (vzVector<int> theSensor) { int i ; double average; average = 0.0; vzClassifier. cpp for (i=0; i<mClassifierSetSize; i++) average += mClassifierSet [i] .GetFitness () ; average /= mClassifierSetSize; i = SelectWeak (mClassifierSet, mClassifierSet. length() ) ; mClassifierSet [i] .BuildCover (theSensor, average) ; return i; void vzClassifier: : pplyReward (int score) { double tmpHonorarium = 0.0; double • totHonorarium = 0.0; int bestAction; int i ; double tmpFitness; bestAction = mClassifierSet [mActionSet [0] ] .GetAction () ; for (i=0; i<mClassifierSet. length( ) ; i++) { tmpFitness = mClassifierSet [i] .GetFitness () ; mClassifierSet [i] .SetFitness ( tmpFitness * (1.0-mGener alTaxRate) ) ; '} for (i=0; i<mMatchSize; i++) if ( mClassifierSet [mMatchSet [i] ] .GetActionO != be stAction ) { tmpFitness = mClassifierSet [mMatchSet [i] ] .G etFitness ( ) mClassifierSet [mMatchSet [i] ] . SetFitness ( tm pFitness * (1.0-mBadMa tchTaxRate) } /* for (i=0; i<mActionSize; i++) { tmpHonorarium = mClassifierSet [mActionSet [i] ] .GetFi tness () * kHonorariumRate; vzClassifier. cpp mClassifierSet [mActionSet [i] ] . SetFitness ( mClassifierSet [mActionSet [i] ] .GetFitness () - tmpHonorarium) totHonorarium += tmpHonorarium; } for (i=0; i<mOldActionSize; i++) mClassifierSet [mOldActionSet [i] ] . SetFitness (tmpHono rariu / mOldActionS ize) ; */ for (i=0; i<mActionSize; 'i++) { tmpFitness = mClassifierSet [mActionSet [i] ] .GetFitne ss ( ) ; tmpFitness *= 1. O+mGeneralTaxRate; mClassifierSet [mActionSet [i] ] . SetFitness ( tmpFitnes s + ' ( ( (double) s core) /mActionSize) ); } DoTournament ( ) ; int vzClassifier: :SelectStrongAction(vzVector<int> theS et, int size) { int i ; int r; double TotalFitness; TotalFitness = 0.0; for ( i=0; i<size; i++ ) TotalFitness += mClassifierSet [theSet[i] ] .GetFitnes r = getRandom( (int) TotalFitness ); TotalFitness = 0.0; for ' ( i=0; i<size; i++ ) { TotalFitness += mClassifierSet [theSet [i] ] ' . GetFitnes vzClassifier. cpp sO; if ( TotalFitness >= r ) break; } return i; int vzClassifier : -.BuildActionSet ( ) { int retSelection; int i ; for (i=0; i<mActionSize; i++) mOldActionSet [i] = mActionSet [i] ; mOldActionSize = mActionSize; retSelection = SelectStrongAction (mMatchSet, mMatchSize); mActionSize = 0; for (i=0; i<mMatchSize; i++) { if (mClassifierSet [mMatchSet [i] ] .GetActionO == mClassifierSet [mMatchSet [retSelecti on] ] .GetActionO ) { mActionSet [mActionSize] = mMatchSet [i] ; mActionSize++; } } return mClassifierSet [mMatchSet [retSelection] ] .GetActionO ; / ***************************************************************** ******* vzClassif ier. /* ******************************************************************* ********** Van Zandt vzClassif ier .h ****** *********** *** ********** * ******** * * **** ******** ** ** ** ******* * ********** * / #if ! defined (_vzClassifier_h) #define _ClassSystem_h ttinclude "vzPopulation.h" ttinclude "vzLib\vzTools .h" #include "vzLib\vzVector.h" class vzClassifier { private : int mClassifierSetSize; double mGeneralTaxRate; double mBadMatcϊiTaxRate; double mHonorariumRate; int mMutationPerlOOO; int mTournamentSize; int mTournamentCount; int mRegeneratePerlOOO ; int mMatchSize; ' int mActionSize; int mOldActionSize; vzPopulation *mpClassifierSetPtr; vzVector<int> mMatchSet; vzVector<int> mActionSet; vzVector<int> mOldActionSet; public : vzClassifier ( int kClassifierSetSize, double kGeneralTaxRate, double kBadMatchTaxRate, double kHonorariumRate, int kMutationPe rlOOO, int kTournament Size, mt kTournament vzClassif ier . h Count, int kRegenerate PerlOOO int BuildCover (vzVector<int> theSensor) ; void BuildMatchSet (vzVector<int> theSensor); int GetMove (vzVector<int> theSensor); int BuildActionSet ( ) ; int SelectStrongAction(vzVector<int> theSet, in ' t size) ; void ApplyReward(int score); // void PrintClassifiers (ofstream out); }; #include "vzClassifier .cpp" #endif // _vzClassifier_h //******************************************************'*********** ********* vzComputer. /* ******************************************************************* ****** vzComputer.h Van Zandt ******************************************************************* ****** #if !defined(_vzComputer_h) #define _vzComputer_h tinclude <allegro.h> #include <fstream.h> // Global Variables static bool GraphicsOn = false; static int TimerInterval = 0; static bool Trace = true; static bool New = false; static int Summation=0 ; static int Counter=0; const int kHighFlow = 80? const int kLowFlow = 40; const int kHighCapacity = 100; const int kLowCapacity = 20; const int kStartFlow = 120; enum vzCOLOR { WHITE, RED, GREEN, YELLOW, BLUE, MAGENTA, C YAN, DARKGRAY, LIGHTGRAY, LIGHTRED, ' LIGHTG REEN, LIGHTYELLOW, LIGHTBLUE, LIGHTMAGENTA,- LIGHTCYAN, BL ACK }; void StartGraphics ( ) { ' allegro_init ( ) ; install_keyboard() ; install_mouse ( ) ; - install_timer ( ) ; set_gfx_mode (GFX_AUTODETΞCT, 640,480,0,0); set_pallete(desktop_pallete) ; GraphicsOn = true; vzComputer . h void StopGraphics ( ) { allegro_exit ( ) ; GraphicsOn = false; } ./* void CapacityChange () { kHighCapacity = kHighCapacity-1; kLowCapacity = kLowCapacity++; } void Sum(int x) { Summation=Summation+ ; Counter++; } int Average ( ) { int Average; Average=Summation/Counter; Counter=0; Summation=0; return Average; } void FlowChange ( ) { kHighFlow = kHighFlow-1; kLowFlow = kLowFlow++; } */ void Reset ( ) { New=true; } void NoReset ( ) { ' New=false; } void SetTimer(int n) { TimerInterval = n; } vzComputer.h void TraceOff ( ) { Trace=false; } void TraceOn { ) { Trace=true; } #include "vzNanoCell .h" #endif // _vzComputer_h //***************************************************************** ****** vzConnector. cpp /* ******************************************************************* ********* vzConnector. cpp Van Zandt ******************************************************************* ********* */ vzConnector: :vzConnector ( ) { } vzConnector : : -vzConnector ( ) { } void vzConnector: :DoCreate(int wordsize, int xO, int yO, int siz e, int x, int y, bool alive, vzEvent Q *apEventQ) { int i ; mWordSize = wordsize; Size = size; mX = xO + (3*mSize*x); // + (3*mSize) ; mY = yO + (3*mSize*y) + ( (x%2) * (3*mSize/2) ); mAlive = alive; mRow = y; mColumn = x; mpEventQ = apEventQ; mColor = cOffColor; mFlow = 0 ; mLabel = false; pSource = NULL; } void vzConnector ::DoDraw( ) { if (mAlive) circlefill (screen,mX,mY,mSize,mColor) ; } void vzConnector: :DoFlood( ) { int i; vzConnector. cpp if ( (mColor==cLowColor) && (mAlive) ) { mColor=cHighColor; if (Trace) DoDraw( ) ; mpEventQ->UpdateFuture (mNeighborArray [i] ) ; int vzConnector: :GetX( ) return mX; int vzConnector: :GetY( ) return mY; int vzConnector: :GetSize() return Size; void vzConnector: :DoClear () if ( mAlive ) { mColor = cOffColor; if (Trace) DoDraw( ) ; mLabel = false ; mpSource = NULL ; mFlow = 0 ; } void vzConnector: :GiveFlow(int flow,bool meaningless, vzDevice *p) { mFlow = flow; mpSource = p; } vzConnector . cpp bool vzConnector : : GetLabel ( ) { return mLabel; } int vzConnector : :DoAugment (int x) { int j ; for (j=0 ; <mNeighborCount; j++) • if (mNeighborArray [j ] ==mpSource) { mColor=cLowColor; if (Trace) DoDraw( ) ; mpEventQ->UpdateFuture (mNeighborArray[j] ) ; } return x; } void vzConnector : :CheckFlow() { int j ; int sum; sum =0; for (j=0; j<mNeighborCount; j++) sum=sum+mNeighborArray[j ] ->GetFlow(true) +mNeighborA rray[j ] ->GetFlow( false) ; sum=sum/2 ; if (sum==0) mColor=cOffColor; else if (sum<=kLowFlow) mColor=cLowColor; else if (sum>=kHighFlow) mColor=cHighColor; else mCoϊor=cMiddleColor; } int vzConnector: :DoLabel (bool lefttoright) { int j, space; if ( (mLabel==false) && (mFlow>0) ) { vzConnector . cpp mColor = cHighColor; if (Trace) DoDraw ( ) ; for ( =0; j<mNeighborCount; j++) { if (mNeighborArray[j]->GetLabel() == false) { space = mNeighborArray [j] ->GetSpace (lefttoright) ; if ( space != 0 ) { if (space<mFlow) mNeighborAr r y[jl ->GiveFlow(space, lefttoright, ' this) ; else mNeighborAr ray[j ] ->GiveFlow (mFlow, lefttoright, this) ; mpEventQ->UpdateFuture (mNeighborArray[j] ) ; } } } } mLabel = true; return 0; } void vzConnector: :ClearStart() { mColor = cOffColor; mFlow = 0; mLabel = false; mpSource = NULL; } //***************************************************************** ********* vzConnector.h /* ******************************************************************* ********* vzConnector.h Van Zandt ******************************************************************* ********* */ #if ' ! defined (_vzConnector_h) #define _vzConnector_h tinclude "vzLib\vzVector .h" #include "vzDevice.h" tinclude "vzEventQ.h" const int cOffColor = DARKGRAY; const int cLowColor = YELLOW; const int cMiddleColor = LIGHTBLUE; const int cHighColor = BLUE; class vzRegister; class vzConnector : public vzDevice { private : int mX; int mY; int mSize; int mAlive; int mRow; int mColumn; int mColor; int mWordSize; vzEventQ *mpEventQ; int mFlow; bool mLabel; vzDevice *mpSource; ■ public: vzConnector () ; -vzConnector ( ) ; void DoCreate(int wordsize, int xO, int yO, int size, in t x, int y, bool alive, vzEventQ *apEve ntQ) ; void DoDraw(); vzConnector.h bool IsAlive ( ) {return mAlive; } ; mt GetRowO { return mRow? } ; int GetColumnO { return mColumn; } ? void DoFloodO ; void DoClear O ; int GetX ( ) ; int GetY ( ) ; int GetSizeO ; void GiveFlow(int flow, bool meaningless, vzDevice *p) bool GetLabel ( ) ; int DoAugmen (int x) ; bool IsADrain ( ) {return false? } ; int GetSpace(bool lefttoright) {return 0;}; int GetFlow(bool lefttoright) {return 0;}; void CheckFlo ( ) ; int DoLabel(bool lefttoright); void ClearStartO ; } iinclude "vzConnector. cpp" #endif // _vzConnector_h ***************************************************************** ********* vzDevice.cpp /* ******************************************************************* ******* vzDevice. ccp Van Zandt ******************************************************************* ******* vzDevice: :vzDevice() : mStatus (0) ,mNeighborCount (0) { int i; mNeighborArray. resize (2) ; mNeighborCurrent. resize (2) ; for (i=0 ' ;i<2;i++) { mNeighborArray [i] =NULL; mNeighborCurrent [i] = 0; } } vzDevice : : -vzDevice ( ) ' { } void vzDevice: -.AddNeighbor (vzDevice *N) { int i ; mNeighborArray [mNeighborCount] =N; mNeighborCount++; if ( mNeighborCount >= mNeighborArray. length () ) { mNeighborArray. resize (mNeighborCount+4) ; mNeighborCurrent . resize (mNeighborCount+4) ; for (i=0; i<4; i++) mNeighborCurrent [mNeighborCount+i] = 0; } } vzDevice *vzDevice : : GetNeighbor (int n) { return mNeighborArray[n] ; vzDevice. cpp int vzDevice: :GetCurrent (vzDevice *dPtr) { int i ; int retCode = 0 ; for ( i=0; i<mNeighborCount; i++ ) if ( dPtr == mNeighborArray [i] ) retCode = mNeighborCurrent [i] ; return retCode; vzDevice . h ******************************************************* ************ ********** vzDevice . Van Zandt ************** ***** ******* ***** ******* * * ****** ******** * ************ ********** */ #if J def ined (_vzDevice_h) #define _vzDevice_h #include "vzLib\vzVector .h" enum pType { in , out } ; enum vzCommand { Flood } ; class vzDevice { protected: int Status; int mNeighborCount; vzVector<vzDevice*> mNeighborArray; vzVector<int> mNeighborCurrent; public: vzDevice ( ) ; -vzDevice { ) ; void AddNeighbor (vzDevice *N) ; vzDevice - *GetNeighbor (int n) ; int GetCurrent (vzDevice *dPtr) ; virtual void DoDra ( ) { } ; virtual void DoFloodO {}; virtual int DoAugment (int x) { } ; virtual bool GetLabel () { } ; virtual void DoClear () {}; virtual void GiveFlow(int f, bool m, vzDevice *p) {}; virtual bool IsADrain {}; virtual int GetFlow(bool m) {}; virtual int DoLabel (bool m) { } ; virtual int GetSpace (bool ) { } ; }; #include "vzDevice. cpp" tendif // _vzDeviσe_h vzEventQ.cpp /* ******************************************************************* ******** vzEventQ. cpp Van Zandt ******************************************************************* ******** */ vzEventQ: :vzEventQ ( ) { mFutureCount=0 ; . mFutureList .resize (50) ; vzEventQ : : -vzEventQ ( ) { } void vzEventQ: :UpdateFuture(vzDevice *N) { if (mFutureList. length () -l<mFutureCount) mFutureList. resize (mFutureList. length ( ) +50) ; mFutureList [mFutureCount] =N; mFutureCount++; } void vzEventQ::DoFire (int command) { int mCurrentCount; int firecounter; vzVector<vzDevice*> mCurrentList; mCurrentList=mFutureList; mCurrentCount=mFutureCount; mFutureCount=0 ; while (mCurrentCount>0) { . for (firecounter=0; firecounter<mCurrentCount; fireco unter++) { switch (command) { case Flood: mCurrentList [fireco unter] ->DoFlood ( ) ; break; ill vzEventQ.cpp doPause (TimerInterval) ; mCurrentCount=mFutureCount; mCurrentList=mFutureList; // rectfill (screen, 0,0, 10, 10,mColor++) ; // if ( mColor > 16 ) // mColor = 0; mFutureCount=0 ; void vzEventQ: :DoLabel (bool lefttoright) { int mCurrentCount? int firecounter; int temp; vzVector<vzDevice*> mCurrentList; mCurrentList = mFutureList; mCurrentCount = mFutureCount; mFutureCount = 0 ; temp = 0 ; while ( mCurrentCount > 0 ) { for (firecounter=0;firecounter<mCurrentCount;fireco unter++) { temp=mCurrentList [firecounter] ->DoLabel (lef ttoright) if temp == 1 ) { mCurrentCount =0 ; mFutureCount =0 ; break; doPause(Timerlnterval) ; mCurrentCount = mFutureCount; mCurrentList = mFutureList; /* rectfill (screen, 0,0, 10, 10,mColor++) ; vzEventQ. cpp if (mColor>16) m ' Color=0; */ mFutureCount=0 ; void vzEventQ: :DoAugment (int min low) { int mCurrentCount; int firecounter; int temp; vzVector<vzDevice*> mCurrentList; mCurrentList = mFutureList; mCurrentCount = mFutureCount; mFutureCount = 0; temp = 0 ; while ( mCurrentCount > 0 ) { for• ( firecounter=0 ; firecounter<mCurrentCount; fireco unter++) { temp = mCurrentList [firecounter] ->DoAugment (minflow) if ( temp == 0 ) { mCurrentCount = 0 ; mFutureCount = 0; break; doPause (Timerlnterval) ; mCurrentCount=mFutureCount ; mCurrentList=mFutureList; rectfill (screen, 0, 0, 10, 10,mColor++) ; if ( mColor > 16 ) mColor = 0;*/ - mFutureCount 0; vzEventQ.h /* ******************************************************************* ******** vzEventQ.h Van Zandt ******************************************************************* ******** */ #if ! defined (_vzEventQ_h) #define _vzEventQ_h #include "vzLib\vzVector .h" #include "vzDevice.h" #include "vzLib\vzTools .h" class vzEventQ { private: int mFutureCount; vzVector<vzDevice*> mFutureList; int mColor; public: vzEventQ ( ) ; -vzEventQ ( ) ; void UpdateFuture (vzDevice *D) ; void DoFire(int command); void DoLabel (bool lefttoright); void DoAugment (int minflow); }; tinclude "vzEventQ. cpp" #endif // _vzEventQ_h vzlndividual .cpp /* ******************************************************************* ******* Van Zandt vzlndividual . cpp ******************************************************************* ******* */ vzlndividual: :vzlndividual (int size, int alpha_count) : mSize(size), mAlphabetCount (alpha_count) mChromosome. resize ( Size) ; vzlndividual : : -vzlndividual ( ) void vzlndividual: :DoResize (int size) mChromosome. resize (size) ; * void vzlndividual: :PrintToFile (ofstream out) void vzlndividual: :DoPrint(int x, int y) void vzlndividual : : DoMutate ( ) { int i ; int r; int c; for (i=0; i<100; i++) { r = getRandom(mChromosome . length ( ) ) ; c = getRandom(mAlphabetCount) ; vzlndividual. cpp while ( mChromosome [r] == c ) c = getRandom(mAlphabetCount) ; mChromosome [r] = c; void vzlndividual : :DoCrossover (vzlndividual *cPtr) { int i ; int r; r = getRandom (mChromosome. length () ) ; if ( getRandom(2) ) for (i=0; i<r; i++) mChromosome [i] = cPtr->mChromosome [i] ; else for (i=r; i<mChromosome . length () ; i++) mChromosome [i] = cPtr->mChromosome[i] ; void vzlndividual : :BuildRandom( ) { int i ; for (i=0; i<mChromosome.length( ) ; i++) mChromosome [i] = getRandom (mAlphabetCount) ; } vzlndividual vzlndividual: :operator= (const vzlndividual rhs) { int i ; for (i=0; i<mChromosome. lengt () ; i++) mChromosome [i] = rhs .mChromosome [i] ; mFitness = rhs.mFitness; return *this; /***************************************************************** ******* vzlndividual .h /* ******************************************************************* ********** Van Zandt vzlndividual .h ******************************************************************* ********** * #if ! defined (_vzlndividual_h) tdefine vzlndividual h #include "vzLib\vzTools .h" #include "vzLib\vzVector.h" class vzlndividual { private : const int mSize; const int mAlphabetCount; vzVector<int> mChromosome; double mFitness ; public: vzlndividual (int size, int alpha_count) -vzlndividual ( ) ; void DoResize(int size); void BuildRandom( ) ; double GetFitness () { return mFitness; }; void SetFitness (double fitness) { mFitness=fitness; } ; int GetValue (int i) { return mChromosome [i] ; } ; vzVector<int> *GetChromosomePtr ( ) { return SmChromosome; }; void DoMutate ( ) ; void DoCrossover (vzlndividual *cPtr) ; vzlndividual operator= (const vzlndividual rhs); // void DoPrint(int x, int y) ; // ■ void PrintToFile (ofstream out) ; }? • #include "vzlndividual. cpp" #endif // _vzlndividual_h //***************************************************************** ********* vzNanocell . cpp /* ******************************************************************* ********* vzNanocell . cpp Van Zandt ******************************************************************* ********* */ vzNanocell ::vzNanocell ( ) : mActive (false) , mWordSize (0) , mRowCount ( 0) , mColumnCount (0) { int i; mSwitchMax = 50; mSwitchCount = 0; mpSwitch. resize (mSwitchMax) ; for (i=0;i<mSwitchMax;i++) mpSwitch[i] =new vzSwitch; } vzNanocell : : -vzNanocell ( ) { int i; for (i=0;i<mSwitchMax; i++) if (mpSwitch [i] != NULL) delete mpSwitch[i] ; if (mpInRegister != NULL) delete mpInRegister ? if (mpOutRegister != NULL) delete mpOutRegister; } void vzNanocell: :DoCreate (int WordSize, int devicesize, int rowcoun t, int columncount, int density, int switchd ensity) { int r, c? int border; int temp; bool alive; mWordSize = WordSize; vzNanocell . cpp mDeviceSize = devicesize; mRowCount = rowcount; mColumnCount = columncount ; mConnector .resize (mRowCount, mColumnCount) ; mDensity = density; mSwitchDensity=switchdensity; mpInRegister = new vzRegister (mWordSize, mDeviceSize); mpOutRegister = new vzRegister (mWordSize, mDeviceSize); border = 1 + mDeviceSize; mXl = (SCREEN_W/2) - ( (mColumnCount+1) * 3 * mDeviceSize) /2 - b order; mYl = (SCREEN_H/2) - (mRowCount*3*mDeviceSize) /2 - border; mX2 = (SCREEN_W/2) + ( (mColumnCount+3 ) * 3 * mDeviceSize) /2 + b order; mY2 = (SCREEN_H/2) + (mRowCount*3*mDeviceSize) /2 + border; jonActive = true; mpInRegister->DoCreate(mXl- (8*mDeviceSize) ,mYl,mY2, true,&mΞven tQ); mpOutRegister->DoCreate(mX2- (4*mDeviceSize) ,mYl,mY2, false, &mEv entQ) ; for (r=0; r<mRowCount; r++) for (c=0; c<mColumnCount; C++) { if ( getRandom (100) < mDensity ) alive = true; else alive = false; } mConnector [r] [c] .DoCreate (mWordSize, mXl+6*mDeviceSi ze,mYl+2*mDeviceSize, mDeviceSize, c,r, alive, &mEventQ) ; } for (r=0;r<mRowCount;r++) for (c=0;c<mColumnCount;c++) vzNanocell . cpp if (mConnector [r] [c] .IsAliveO ) { if ( (c==0)&&(r<mRowCount-l) ) { if (mConnector [r] [c+1] .IsAl ive ) SetSwitch(r, c,r, c+1 ); if (mConnector [r+1] [c] .IsAl ive () ) SetSwitch(r, c,r+l,c ); } if ( (c>0)&&(c<mColumnCount-l)&&(c%2 >0) &&(r<mRowCount-l) ) { if (mConnector [r+1] [c-1] .Is Alive () ) SetSwitch(r, c,r+l, c -1); if (mConnecto [r+1] [c] .IsAl ive ( ) ) SetSwitch(r, c,r+l,c )? if (mConnector [r+1] [c+1] .Is Alive ( ) ) SetSwitch(r, c,r+l,c +1); } if ( (c>0)&S(c<mColumnCount-l)S:&(c%2 .==0)&&(r<mRowCount-l) ) { if (mConnector [r] [c-1] .IsAl ive ( ) ) SetSwitch(r, c , r, c-1 ); vzNanocell . cpp if (mConnector [r+1] [c] .IsAl ive () ) SetSwitch(r, c, r+1, c ); if (mConnector [r] [c+1] .IsAl ive ( ) ) SetSwitch(r, c,r, c+1 ); } . if ( (r==mRowCount-l) && (c<mColumnCou nt-l)&&(c%2==0) ) { if (mConnecto [r] [c+1] .IsAl ive ( ) ) SetSwitch(r, c , r, c+1 ); } if ( (r==mRowCount-l) && (c<mColumnCo unt-l)&&(c%2>0) )- { if (mConnecto [r] [c+1] .IsAl ive ( ) ) SetSwitch(r, c, r, c+1 ); } if ( (r<mRowCount-l) && (c==mColumnCou nt-l)&&(c%2==0) ) { if (mConnector [r] [c-1] .IsAl ive ( ) ) SetSwitch(r, c, r, c-1 ) ? if (mConnector [r+1] [c] .IsAl ive ( ) ) SetSwitch(r,c, r+1, c } if ( (r<mRowCount-l)&&(c==mColumnCou nt-l)&&(c%2>0) vzNanocell .cpp if (mConnector [r+1] [c-1] .Is Alive ( ) ) SetSwitch (r, c,r+l, c -l); if (mConnector [r+1] [c] .IsAl ive ( ) ) SetSwitch (r,c, r+1, c ); } for (r=0;r<mRowCount;r++) { if (mConnector [r] [0] .IsAliveO ) { temp=mpInRegister->ConnectToPin (&mC onnector [r] [ 0] , mSwitchDensity*2 ) ; if (temp>=0 ) SetPinSwitch(mpInRegister-> GetPinPtr(temp) , &mConnector [r] [0] ) ; } if (mConnector [r] [mColumnCount-1] .IsAliveO ) { temp=mpOutRegister->ConnectToPin (&m Connector [r] [mColumnCount-1] , mSwitchDensity*2) ; if (temp>=0) SetPinSwitch (mpOutRegister- >GetPinPtr (temp) , &mConnector [r] [mColumnCount-1] ) ; } } DoDraw ( ) ; } void vzNanocell: : SetSwitch (int rl, int cl, int r2 , int c2) { int i; int state; if ( mSwitchCouήt >= mSwitchMax ) { vzNanocell . cpp mpSwitch . resize (mSwitchMax+50 ) ; for (i=0; i<50; i+ ' +) mpSwitch [mSwitchCount+i] = new vzSwitch; mSwitchMax += 50; } if ( getRandom(100) < mSwitchDensity ) { state = 1 + getRandom (2 ) ; mpSwitch [mSwitchCount] ->DoCreate (mConnector [rl] [cl] .GetXO, mC onnector[rl] [cl] .GetYO , mC onnector[r2] [c2] .Get O , mC onnector[r2] [c2] .GetYO , st ate, SmEventQ) ; mConnector [rl] [cl] .AddNeighbor ( (vzDevice *)mpSwitch [mSwitchCount] ) ; mpSwitch [mSwitchCount] ->AddNeighbor (kmConnector [r1] [cl] ) ; mpSwitch [mSwitchCount] ->AddNeighbor (&mConnector [r2] [c2]); mConnector [r2] [c2] .AddNeighbor ( (vzDevice *) pSwitch [mSwitchCount] ) ; mpSwitch [mSwitchCount] ->SetNeighborlType (1) ; mpSwitch[mSwitchCount] ->SetNeighborlParml (rl) ? mpSwitch [mSwitchCount] ->SetNeighborlParm2 (cl) ; mpSwitch [mSwitchCount] ->SetNeighbor2Type (1) ; mpSwitch [mSwitchCount] ->SetNeighbor2Parml (r2) ; mpSwitch [mSwitchCount] ->SetNeighbor2Parm2 (c2) ; mSwitchCount++; } void vzNanocell: :SetSwitch2 (int rl, int cl, int r2, int c2, int sta te) { mpSwitch [mSwitchCount] = new vzSwitch; vzNanocell .cpp mpSwitch [mSwitchCount] ->DoCreate (mConnector [rl] [cl] .GetX() , mC onnector[rl] [cl] .GetYO , mC onnector[r2] [c2] .GetXO , mC onnector[r2] [c2] .Get O , st ate, &mEventQ) ; mConnector [rl] [cl] .AddNeighbor ( (vzDevice *)mpSwitch [mSwitch Count] ) mpSwitch [mSwitchCount] ->AddNeighbor (&mConnector [rl] [cl] ) ; mpSwitch [mSwitchCount] ->AddNeighbor(&mConnector[r2] [c2] ) ; mConnector [r2] [c2] .AddNeighbor ( (vzDevice *)mpSwitch[mSwitch Count] ) mpSwitch [mSwitchCount] ->SetNeighborlType (1) ; mpSwitch [mSwitchCount] ->SetNeighborlParml (rl) ; mpSwitch [mSwitchCount] ->SetNeighborlParm2 (cl) ; mpSwitch [mSwitchCount] ->SetNeighbor2Type (1) ; mpSwitc [mSwitchCount] ->SetNeighbor2Parml (r2) ; mpSwitch [mSwitchCount] ->SetNeighbor2Parm2 (c2 ) ? mSwitchCount++? } void vzNanocell: :SetPinSwitch2 (vzPin *aPin, vzConnector *aConnector , int state) { . ■ mpSwitch [mSwitchCount] = new vzSwitch; mpSwitch [mSwitchCount] ->DoCreate (aConnector->GetX() , aC onnector->GetY() , aP in->GetOutX2 ( ) , aC onnector->GetY() , st ate, &mEventQ) ; aConnector->AddNeighbor ( (vzDevice *)mpSwitch[mSwitchCount] mpSwitc [mSwitchCount] ->AddNeighbor (aConnector) ; mpSwitch[mSwitchCount] ->AddNeighbor (aPin) ; aPin->AddNeighbor (mpSwitch[mSwitchCount] ) ; mpSwitc [mSwitchCount] ->SetState (state) ; vzNanocell .cpp mpSwitch[mSwitchCount] ->SetNeighborlType (1) ? mpSwitch [mSwitchCount] ->SetNeighborlParml (aConnector->GetRo wO); mpSwitch[mSwitchCount] ->SetNeighborlParm2 (aConnector->GetCo lumn ( ) ) ? mpSwitch [mSwitchCount] ->SetNeighbor2Type ( 0 ) ; mpSwitch[mSwitchCount] ->SetNeighbor2Parml (aPin->GetType() ) ; mpSwitch[mSwitchCount] ->SetNeighbor2Parm2 (aPin->GetID() ) ; mSwitchCount++; } void vzNanocell :: SetPinSwitch(vzPin *aPin, vzConnector *aConnector) { int i ; int state; state = 1 + getRandom(2 ) ; if ( mSwitchCount >= mSwitchMax ) { mpSwitch. resize (mSwitchMax+50) ; for (i=0; i<50; i++) mpSwitch [mSwitchCount+i] = new vzSwitch; mSwitchMax += 50; } mpSwitch [mSwitchCount] ->DoCreate (aConnector->GetX() , aC onnector->GetY () , aP in->GetOutX2 ( ) , aC onnector->GetY 0 , st ate, ScinEventQ) ; aConnector->AddNeighbor ( (vzDevice *) mpSwitch[mSwitchCount] ) ; mpSwitch[mSwitchCount] ->AddNeighbor(aConnector) ; mpSwitch[mSwitchCount] ->AddNeighbor (aPin) ; aPin->AddNeighbor (mpSwitch [mSwitchCount] ) ; mpSwitch[mSwitchCount] ->SetNeighborlType (1) ; mpSwitc [mSwitchCount] ->SetNeighborlParml (aConnector->GetRo vzNanocell . cpp O); mpSwitch[mSwitchCount] ->SetNeighborlParm2 (aConnector->GetCo lumn () ) ; mpSwitch [mSwitchCount] ->SetNeighbor2Type ( 0 ) ; mpSwitch [mSwitchCount] ->SetNeighbor2Parml (aPin->GetType() ) ; mpSwitch [mSwitchCount] ->SetNeighbor2Parm2 (aPin->GetID( ) ) ; mSwitchCount++; } void vzNanocell : :DoClear ( ) { int r, c; int i ; mpInRegister->DoClear ( ) ; mpOutRegister->DoClear ( ) ; for (r=0; r<mRowCount; r++) for (c=0; c<mColumnCount ; C++) " { • if ( mConnector [r] [c] .IsAlive () ) mConnector [r] [c] .DoClear () ; } for (i=0; i<mSwitchCount; i++) mpSwitch[i] ->DoClear() ; } void vzNanocell: :DoDra () { int r, c; if ( mActive ) { rectfill {screen,mXl,mYl,mX2,mY2,LIGHTGRAY) ; mpInRegister->DoDraw() ; mpOutRegister->DoDraw ( ) ; for (r=0; r<mRowCount; r++) for (c=0; c<mColumnCount; C++) mConnector [r] [c] . DoDraw() ; for (r=0;r<mSwitchCount;r++) mpSwitch[r] ->DoDraw( ) ; vzNanocell . cpp } void vzNanocell: :DoFlood() { mpInRegister->DoFlood( ) ; mpOutRegister->DoFlood() ; mEventQ.DoFire(Flood) ; } void vzNanocell: :DoFlow() { int minflow = 0; int r, c; bool abletolabelone = true; bool abletolabeltwo = true; bool abletolabelthree = true; bool abletolabelfour = true; bool breakerone = true; bool breakertwo = true; while ( (breakerone) | | (breakertwo) ) { mpInRegister->DoLabel (true) ; mEventQ.DoLabel (true) ; abletolabelone=mpOutRegister->CheckLabel () ; abletolabeltwo=mpInRegister->CheckLabel ( ) ; if ( (abletolabelone) | | (abletolabeltwo) ) { if (abletolabelone) inflow=mpOutRegister->DoAugment ( ) ; else minflow=mpInRegister->DoAugmeht ( ) ; mEventQ .DoAugment (minflow) ; mpInRegister->DoClear () ; mpOutRegister->DoClear ( ) ; for (r=0; r<mRowCount; r++) for (c=0; c<mColumnCount; C++) mConnector [r] [c] .DoClear () ; for (r=0;r<mSwitchCount;r++) mpSwitch [r] ->DoClear ( ) ; } else vzNanocell .cpp breakerone=false; mpOutRegister->DoLabel (false) ; mEventQ. DoLabel (false) ; abletolabelthree=mpInRegister->CheckLabel ( ) ; abletolabelfour=mpOutRegister->CheckLabel () ; if ( (abletolabelthree) | | (abletolabelfour) ) { if (abletolabelthree) minflow=mpInRegister->DoAugment ( ) ; if (abletolabelfour) minflow=mpOutRegister->DoAugment ( ) ; mEventQ. DoAugment (minflow) ; mpInRegister->DoClear { ) ; mpOutRegister->DoClear() ; for (r=0; r<mRowCount; r++) for (c=0; c<mColumnCount; C++) mConnector [r] [c] .DoClear (); for (r=0;r<mSwitchCount;r++) mpSwitch[r] ->DoClear() ; } else breakertwo=false; } int vzNanocell: :GetPinNum() { return mWordSize; } int vzNanocell: :0nPin(int xl,int yl) { int FirstReply; int SecondReply; FirstReply=mpInRegister->OnPin (xl ,yl) ; if (FirstReply>=0) return FirstReply; else SecondReply=mpOutRegister->OnPin(xl,yl) ; if (SecondReply>=0) return SecondReply+mWordSize; else return -1; } vzNanocell. cpp void vzNanocell : :SetPin (bool InRegister, int WhichPin, int flow) { if (InRegister) mpInRegister->SetPin (WhichPin, flow) ; else mpOutRegister->SetPin (WhichPin, flow) ; } int vzNanocell': :PinHeight (int WhichPm) { return (mpInRegister->PinHeight (WhichPin) ) ; } int vzNanocell : :GetFlow (bool WhichRegister, int WhichPin) { int flow; if (WhichRegister) flow=mpInRegister->GetPinFlow(WhichPin) ; else flow=mpOutRegister->GetPinFlow(WhichPin) ; return flow; } void vzNanocell : :DeactivatePin (bool WhichRegister, int WhichPin) { if (WhichRegister) mpInRegister->DeactivatePin (WhichPin) ; else mpOutRegister->DeactivatePin (WhichPin) ; } void vzNanocell : :Drawpaths () { int r, c ; for (r=0; r<mRowCount; r++) for (c=0; c<mColumnCount; C++) { mConnector [r] [c] .CheckFlowO ; mConnector [r] [c] .DoDraw() ; } for (r=0;r<mSwitchCount;r++) mpSwitch [r] ->DoDraw() ; } int vzNanocell: :GetInitialFlow(bool WhichRegister, int WhichPin) { int flow; vzNanocell . cpp if (WhichRegister) flow=mpInRegister->GetInitialFlo (WhichPin) ; else flow=mpOutRegister->GetInitialFlow(WhichPin) ; return flow; } void vzNanocell: :ClearCell() { int r, c; mpInRegister->ClearStart ; mpOutRegister->ClearStar ( ) ; for (r=0; r<mRowCoun ; r++) for (c=0; c<mColumnCount; C++) mConnector [r] [c] .ClearStart { ) ; for (r=0;r<mSwitchCount;r++) mpSwitch [r] ->ClearStart ( ) ; if ( Trace ) DoDra ( ) ; } void vzNanocell: :SetInReg(vzString aFireCode) { mpInRegister->Write (aFireCode) ; } void vzNanocell :: SetOutReg (vzString aFireCode) { mpOutRegister->Write (aFireCode) ; ) void vzNanocell: :LoadSwitch(vzVector<int> *vPtr) { int i; if ( vPtr->length( ) == mSwitchCount ) { for (i=0; i<mSwitchCount; i++) mpSwitch[i]->SetState(l+(*vPtr) [i] ) ; } } vzPin *vzNanocell: .-GetPinPtr (pType type, int i) { if ( type == in ) vzNanocell .cpp return mpInRegister->GetPinPtr (i) ; else return mpOutRegister->GetPinPtr (i) ; } int vzNanocell: :GetConnectorData (int x) { return mConnectorData[x] ; } int vzNanocell : : GetColumnCount ( ) { return mColumnCount; } int vzNanocell : :GetWordSize ( ) { int r, c, temp; temp=mSwitchData. length ( ) ; c=0; for (r=0;r<temp;r++) { if ( (mSwitchData [r] >0 ) && (c<mSwitchCount) ) { mSwitchData [r] = mpSwitch [c] ->GetState ( ) ; C++ ? } } return mWordSize; } int vzNanocell : :GetRowCount ( ) { return mRowCount; } int vzNanocell : :GetSwitchDataSize ( ) { return mSwitchData. length () ; } int vzNanocell: :GetSwitchData (int y) { return mSwitchData[y] ; vzNanocell .cpp void vzNanocell :: DoLoad(vzString filename) { int i ; int r, c; int border; int • temp; bool alive; int tmpState; int tmpNeighborlType, tmpNeighborlParml , tmpNeighborlParm2 ; int tmpNeighbor2Type, tmpNeighbor2Parml , tmpNeighbor2Parm2; ifstream infile; infile.open( filename. c_str ( ) ) ; infile » mWordSize; infile » mDeviceSize; infile » mRowCount; infile » mColumnCount; mConnector. resize (mRowCount,mColumnCount) ; infile » mDensity; infile » mSwitchDensity; infile » mSwitchCount; mSwitchMax = mSwitchCount; mpSwitch. resize (mSwitchMax) ; mSwitchCount = 0; mpInRegister = new vzRegister (mWordSize, mDeviceSize); mpOutRegister = new vzRegister (mWordSize, mDeviceSize) border = 1 + mDeviceSize; mXl = (SCREΞN_W/2) - { (mColumnCount+1) * 3 * mDeviceSize) /2 - b order; mYl = (SCREEN_H/2) - (mRowCount*3*mDeviceSize) /2 - border; mX2 = (SCREEN_W/2) + ( (mColumnCount+3 ) * 3 * mDeviceSize) /2 + b order; mY2 = (SCREEN_H/2) + (mRowCount*3*mDeviceSize) /2 + border; mActive = true; mpInRegister->DoCreate (mXl- (8*mDeviceSize) ,mYl,mY2 , true, &mEven vzNanocell .cpp tQ); mpOutRegister->DoCreate(mX2- (4*mDeviceSize) ,mYl,mY2, false, &mEv entQ) ; for (r=0; r<mRowCount; r++) for (c=0; c<mColumnCount; C++) { infile » alive; mConnector [r] [c] .DoCreate (mWordSize,mXl+6*mDeviceSi ze,mYl+2*mDeviceSize, mDeviceSize, c, r, alive, &mEventQ) ; } for (i=0; i<mSwitchMax; i++) { infile » tmpState; infile » tmpNeighborlType; infile » tmpNeighborlParml; infile » tmpNeighborlParm2 ; infile » tmpNeighbor2Type; infile » tmpNeighbor2Parml; infile » tmpNeighbor2Parm2 ; if ( tmpNeighbor2Type == 1 ) SetSwitch2 (tmpNeighborlParml, tmpNeighborlP arm2 tmpNeighbor2Parml, t pNei ghbor2Parm2, tmpState) else { if ( tmpNeighbor2Parml == 0 ) SetPinSwitch2 (mpInRegister->GetPinP tr (tmpNeighbor2Parrtι2 ) , &mConnecto r [tmpNeighborlParml] [tmpNeighborlParm2] , tmpState) ; else SetPinSwitch2 (mpOutRegister->GetPin Ptr (tmpNeighbor2Parm2) , &mConnecto r [tmpNeighborlParml] [tmpNeighborlParm2] , tmpState) ; vzNanocell . cpp } } infile. close ( ) ; } void vzNanocell: : DoStore (vzString filename) { int i ; int r, c ; ofstream outfile; outfile. open ( filename. c_str ( ) ); outfile « mWordSize « endl; outfile « mDeviceSize « endl; outfile « mRowCount « endl; outfile « mColumnCount « endl; outfile « mDensity « endl; outfile « SwitchDensity « endl; outfile « mSwitchCount « endl; for (r=0; r<mRowCount; r++) for (c=0; c<mColumnCount; C++) outfile « mConnector [r] [c] . IsAliveO « en dl; for (i=0; i<mSwitchCount; i++) { outfile « mpSwitch [i] ->GetState() « endl; outfile « mpSwitch [i ] ->GetNeighborlType() « endl; outfile « mpSwitch [i ] ->GetNeighborlParml () « endl outfile « mpSwitch [i] ->GetNeighborlParm2 () « endl outfile « mpSwitch [i ] ->GetNeighbor2Type() « endl; outfile « mpSwitc [i] ->GetNeighbor2Parml () « endl outfile « mpSwitch [i] ->GetNeighbor2Parm2 () « endl } outfile . close ( ) ; vzNanocell . cpp /***************************************************************** ********* vzNanocell. /* ******************************************************************* ********* vzNanocell .h Van Zandt ******************************************************************* ********* #if ! defined (_vzNanocell_h) #define _vzNanocell_h #include "vzEventQ.h" #include "vzRegister .h" tinclude "vzConnector .h" tinclude "vzLib\vzTools .h" tinclude "vzLib\vzString.h" #include "vzSwitch.h" tinclude "vzLib\vzMatrix.h" tinclude "vzLib\vzVector .h" class vzNanocell { private : • bool mActive; int mWordSize; int mRowCount ; int mColumnCount; int mDeviceSize; int mDensity; int mSwitchDensity; int mSwitchMax; int mXl; int Yl; int mX2; int mY2; int mSwitchCount; vzRegister *mpInRegister; vzRegister *mpOutRegister; int sizecount; vzMatrix<vzConnector> mConnector; vzVector<vzSwitch *> mpSwitch; vzEventQ mEventQ; vzVector<int> mConnectorData; vzVector<int> mSwitchData; public: vzNanocell ( ) ; -vzNanocell ( ) ; vzNanocell.h void DoCreate (int WordSize, int devicesize, int rowcount int columncount, int density, int switchdeήsity) ; void SetSwitch (int rl, int cl, int r2, int c2); void SetSwitch2 (int rl, int cl, int r2 , int c2, int stat e); void SetPinSwitch2 (vzPin *aPin, vzConnector *aConnector, int state) ; void SetPinSwitch (vzPin *aPin, vzConnector *aConnector) ; int GetSwitchCount () { return mSwitchCount; }, • void DoClear ( ) ; void DoDraw( ) ; void DoFloodO ; void DoFlow( ) ; int GetPinNum( ) ; int OnPin (int xl, int yl) ; void SetPin(bool InRegister, int WhichPin, int flow); int PinHeight (int WhichPin); int GetFlow(bool WhichRegister, int WhichPin); void DeactivatePin(bool WhichRegister, int WhichPin); void Drawpaths ( ) ; int GetInitialFlow(bool WhichRegister, int Which Pin) ; void ClearCell () ; ■ void SetlnReg (vzString aFireCode) ; void SetOutReg (vzString aFireCode); void LoadSwitch(vzVector<int> *vPtr) ; vzPin *GetPinPtr (pType type, int i) ; int GetConnectorData(int x) ; int GetColumnCount ( ) ; int GetWordSize ( ) ; int GetRowCount ( ) ; int GetSwitchDataSizeO ; int GetSwitchData(int y) ; void DoLoad (vzString filename); void DoStore (vzString filename); } , tinclude "vzNanocell. cpp" tendif // _vzNanocell_h //***************************************************************** ********* vzPin. cpp /* ******************************************************************* ****** vzPin . cpp Van Zandt *********************************************************** * ** ** *** ****** */ vzPin : : vzPin ( ) : vzDevice ( ) { } vzPin : : -vzPin ( ) { } void vzPin: :DoCreate (int id, pType type, int xl, int yl, int x2, in t y2, int xl2, int yl2, i nt x22, int y22, int wordsize, vzΞve ntQ *apEventQ) { int i; mID = id; mType = type; mColor = pnDrainColor; mlnXl = xl; mInX2 = x2 ; mlnYl = yl; mInY2 = y2 ; mOutXl = xl2; mOutX2 = x22; mOutYl = yl2; mOutY2 = y22; mWordSize = wordsize; mpEventQ = apEventQ; mFlow=0; mIsADrain=true; mIsASource=false; mTempFlow=0 ; mLabel=false; mDeactivated=false; mInitialFlow=0 ; vzPin. cpp } void vzPin : : DoDraw ( ) { if (mlsADrain) { if (mFlow==0 ) mColor=pnDrainColor; else if (mFlow<=kLowFlow) mColor=pnLowColor; else if (mFlow>=kHighFlow) mColor=pnHighColor; else mColor=pnMiddleColor; } if (mDeactivated) mColor=pn0ffColor; if (mlsASource) mColor=pnSourceColor; rectfill (screen,mInXl,mInYl,mInX2 ,mInY2,mColor) ; rectfill (screen,mOutXl ,mOutYl,mOutX2 ,mOutY2 , Color) ; int vzPin: :GetOutXl () return mOutXl; int vzPin: :GetOutYl ( ) return mOutYl; int vzPin: :GetOutX2 ( ) return mOutX2 ; int vzPin: :GetOutY2 ( ) return mOutY2; vzPin . cpp void vzPin : : DoFlood ( ) { int i ? if (mColor == pnLowColor) { mColor=pnHighColor? if (Trace) DoDraw( ) ; for (i=0 ;i<mNeighborCount; i++) mpΞventQ->UpdateFuture (mNeighborArray [i] ) ; } } void vzPin: : DoClear () { if (mlsADrain) mColor=pnDrainColor; if (mDeactivated) mColor=pnOffColor; if (mlsASource) mColor=pnSourceColor; if (Trace) DoDraw( ) ; mpSource = NULL; mLabel = false; mTempFlow = 0; } bool vzPin: :GetLabel () { return mLabel; } ' bool vzPin: :IsADrain() { return mlsADrain; } void vzPin: :GiveFlow (int flow, bool meaningless, vzDevice *p) { mTempFlow = flow; mpSource = p; mLabel = true; mColor=pnSourceColor; if (Trace) DoDraw( ) ; } vzPin. cpp int vzPin: :DoAugment (int x) { int ; int returncode; if (mlsADrain) { mFlow=mF1ow+mTempF1ow; for (j=0; j<mNeighborCount; ++) if (mNeighborArray[ ] ==mpSource) mpEventQ->UpdateFuture (mNeighborArray[j] ) ; returncode=mTempFlow; } else if (mDeactivated) for (j=0; j<mNeighborCount; j++) if (mNeighborArray[j ] ==mpSource) mpEventQ->UpdateFuture (mNeighborArray[j ] returncode=mTempFlow; } else { mFlow=mFlow-x; returncode=0; } return returncode; int vzPin: :GetFlow(bool lefttoright) { if (mlsASource) return (mlnitialFlow-mFlow) ; else return mFlow; } int vzPin: :GetInitialFlow() { return mlnitialFlow; } void vzPin: :SetStart (int flow) { vzPin.cpp mlsASource = true; mlsADrain = false; mFlow = flow; mlnitialFlow = flow; mTempFlow = 0; mColor = pnSourceColor; if (Trace) DoDraw( ) ; mColor = pnDrainColor; } void vzPin: :DeactivatePin() { mDeactivated = true; mColor = pnOffColor; if (Trace) DoDraw( ) ; mlsADrain = false; int vzPin: :DoLabel (bool lefttoright) { int j, space; int returncode = 0 ; int flow, extra; extra=0; flow=0; if (mlsASource) { if ( (mLabel==false) && (mFlow>0) && (mNeighborCoun t!=0)) { flow=mFlow/mNeighborCount; extra=mFlow%mNeighborCoun ; mColor = pnSourceColor? if (Trace) DoDraw( ) ? for (j=0; <mNeighborCount; j++) { if (mNeighborArray[j ] ->GetLabel ( ) = = false) { space = mNeighborArray[j] -> vzPin. cpp GetSpace(lefttoright) ; if ( space != 0 ) { if (space<flow) mNeighborAr ray [ ] ->GiveFlow(space, lefttoright, this); else { if (extra>0) mNe ighborArray[j ] ->GiveFlow(flow+1, lefttoright, this) ; else mNe ighborArray [j ] ->GiveFlow(flow, lefttoright, this) ; extra=extra-l; } mpEventQ->UpdateFuture (mNeighborArray[j] ) ; } } } } mLabel=true; return 0; } if ( (mDeactivated) && (mLabel==false) && (mTempFlow>0 ) && (mNeighborC ount!=0) ) { mColor = pnSourceColor; if (Trace) DoDraw( ) ; for (j=0 ; <mNeighborCount; ++) { if (mNeighborArray[j ] ->GetLabel() == false) { space = mNeighborArray[j ] ->GetSpace (lefttoright) ; if ( space != 0 ) { if (space<mTempFlow) mNeighborArray[j ] -> GiveFlow(space, lefttoright, this) ; else mNeighborArray[j ] -> GiveFlow(mTempFlow, lefttoright, this) ; mpEventQ->UpdateFuture (mNei ghborArray[j ] ) ; } > } vzPin . cpp mLabel=true; return 0; } void vzPin: :ClearStart () { mColor=pnDrainColor? mFlow=0; mIsADrain=true; mIsASource=false; mTempFlow=0; mLabel=false; mDeactivated=false; mInitialFlow=0; vzPin.h /* ******************************************************************* ******* vzPin.h Van Zandt ******************************************************************* ******* */ tif ! defined (_vzPin_h) tdefine _vzPin_h tinclude "vzLib\vzVector .h" tinclude "vzDevice.h" tinclude "vzEventQ.h" const int pnOffColor = DARKGRAY; const int pnDrainColor = WHITE; const int pnSourceColor = BLUE; const int pnLowColor = YELLOW; const int pnMiddleColor = LIGHTBLUE ? const int pnHighColor = BLUE; class vzPin: public vzDevice { private : int ID; pType mType; int mlnXl ; int mInX2 ; int mlnYl; int mInY2 ; int mOutXl int mOutX2 int mOutYl int mOutY2 int mWordSize; int mColor 1 int mCurrent; vzEventQ *mpEventQ bool mAmlln Pin; bool mLabel ' int mFlow; bool mlsADrain; bool mlsASource; vzDevice *mpSource; vzPin .h int mTempFlow; bool mDeactivated; int mlnitialFlow; public : vzPin ( ) ; ~vzPin ( ) ; void DoCreate (int id, pType type, int xl,int yl,int x2-,i nt y2 , int xl2, int yl2, int x22, int y22 , int wordsize, vzEventQ *apΞ ventQ) ; void DoDraw( ) ; int GetOutXl ( ) ; int GetOutYl ( ) ; int GetOutX2 () ; int GetOutY2 () ; int GetTypeO { return mType; }; int GetlDO { return mID; }; void DoFloodO ; void DoClear () ; bool GetLabel ( ) ; bool IsADrain ( ) ; void GiveFlowdnt flow, bool meaningless, vzDevice *p) ; int DoAugment (int x) ; int GetSpace(bool m) {return 0;}; int GetFlow(bool lefttoright) ; int GetlnitialFlowO ; void SetStart nt flow) ; void DeactivatePin ( ) ; int DoLabel (bool lefttoright); void ClearStart ( ) ; } tinclude "vzPin.cpp" ttendif // _vzPin_h /***************************************************************** ****** vzPopulation. cpp /* ******************************************************************* ******* Van Zandt vzPopulation. cpp ******************************************************************* ******* */ vzPopulation: :vzPopulation ( int tournamentcount, int tournam entsize, int mutate, int crossov er, int ran dom, int count, int size, int alpha_s lze, double ( * e val) (vzlndividual *iPtr) ) mkTournamentCount (tournamentcount) , mkTournamentSize(tournamentsize) , mkMutate (mutate) , mkCrossover (crossover) , mkRandom(random) , mkTotal (mutate + crossover + random) , mkCount (count) , mkSize (size) , mkAlphabetCount (alpha_size) , DoEvaluate (eval) { int i ; mplndividual . resize (mkCount) ; for (i=0; i<mkCount; i++) mplndividual [i] = new vzlndividual (mkSize, mkAlphab etCount) ; } vzPopulation: : -vzPopulation () { int i? for (i=0? i<mkCount? i++) vzPopulation . cpp delete mplndividual [ i ] ; /* void vzPopulation: : PrintToFile (ofstream out) { } */ / * void vzPopulation: :DoPrint (int x, int y) { } f */ void vzPopulation: :ReGenerate(int cycle_count) { int i, j ; for (i=0; i<cycle_count; i++) { if ( mplndividual [SelectBest () ] ->GetFitness () == 0. 0 ) break; for ( =0; <mkTournamentCount; j++) { if ( mplndividual [SelectBest () ] ->GetFitness 0 == 0.0 break; DoTournament ( ) ; } int vzPopulation: : SelectBest ( ) { int i ; int retBestlndex; double retBestFitness; for (i=0; i<mkCount; i++) { if ( i == 0 ) { retBestlndex = 0; vzPopulation.cpp retBestFitness = mplndividual [0] ->GetFitnes s(); } else { if ( mplndividual [i] ->GetFitness ( ) < retBes tFitness ) { retBestlndex = i; retBestFitness = mplndividual [i] ->G etFitness ( ] } } } return retBestlndex; } void vzPopulation: :DoTournament ( ) { int i ; int r; int first = 0 ; int ' second = 0 ; int last = 0 ; double tmpFitness = 0.0; double firstFit = 1000000.0; double secondFit = 1000000.0; double lastFit = 0.0; for (i=0; i<mkTournamentSize; i++) { r = getRandom(mkCount) ; tmpFitness = mplndividual [r] ->GetFitness () ; if ( tmpFitness < firstFit ) { secondFit = firstFit; firstFit = tmpFitness; second = first; first = r; } else if ( tmpFitness < secondFit )• { secondFit = tmpFitness; second = r; } else if ( tmpFitness > lastFit ) vzPopulation. cpp lastFit = tmpFitness ; last = r; } if ( first ! = last ) { r = getRando (mkTotal ) ; if ( r < mkMutate ) { DoClone ( first, last ) ; DoMutate ( last) ; } else if ( r < mkMutate+mkCrossover ) { if ( second ! = last ) { DoClone (first, last); DoCrossover (last, second) ; } } else // ( r < mkMutate+mkCrossover+mkRandom ) { mplndividual [last] ->BuildRandom() ; } mplndividual [last] ->SetFitness (DoEvaluate (mplndivid ualflast]) ) ; } void vzPopulation: :DoClone (int from, int to) * (mplndividual [to] ) = * (mplndividual [from] ) ; void vzPopulation: :DoMutate(int i) mplndividual [i] ->DoMutate ( ) ; void vzPopulation: :DoCrossover (int i, int j) { mplndividual [i] ->DoCrossover (mplndividual [j ] ) ; vzPopulation. cpp } void vzPopulation: :BuildRandom() { int i ; for (i=0; i<mkCount; i++) { mplndividual [i] ->BuildRandom() ; mplndividual [i] ->SetFitness (DoEvaluate (mplndividual [i])) } //***************************************************************** ******* vzPopulation.h /* ******************************************************************* ********** Van Zandt vzPopulation.h ******************************************************************* ********** */ #if ! defined (_vzPopulation_h) tdefine _vzPopulation_h tinclude "vzLib\vzTools .h" tinclude "vzLib\vzVector.h" tinclude "vzlndividual .h" class vzPopulation { private: const int mkTournamen tCount; const int mkTournamen tSize; const int mkMutate; const int mkCrossover const int mkRandom; const int mkTotal ; const int mkCount; const int mkSize; const int mkAlphabetC ount; vzVector<vzIndivi ual *> mplndividual; public: vzPopulation ( int tournamentcount, int tournamentsize, int mutate, int crossover, int random, int count, int size, int alpha_size, double (* eval) (vzlndividua 1 *iPtr) ) ; -vzPopulation ( ) ; vzPopulation.h void BuildRandom( ) ; void ReGenerate (int cycle_count) ; void DoTournament ( ) ; int SelectBest () ; void DoClone (int from, int to); void DoMutate(int i) ; void DoCrossover (int i, int j); vzlndividual *GetIndividualPtr (int i) { return mplndivid ual [i] ; } ; double (* DoEvaluate) (vzlndividual *iPtr) ; // void DoPrint(int x, int y) ; // void PrintToFile(ofstream out) ; }; tinclude "vzPopulation. cpp" tendif // _vzPopulation_h ***************************************************************** ********* vzReg s t er . cpp /* ******************************************************************* ******* ** vzRegister . cpp Van Zandt *** *** * *************************************** ******* ************** ********* */ vzRegister ::vzRegister (int WordSize, int devicesize) : mWordSize (WordSize) , mWidth(devicesize*4) , mXl(O), mYl(O), mX2(0) , mY2 ( 0 ) { mPin= new vzPin [mWordSize] ; } vzRegister: : -vzRegister 0 { delete [] mPin; mPin=NULL; } void vzRegister :: DoCreate (int xl, int yl, int y2 , bool ingrid, vzEventQ *a pEventQ) { int counter; // in for loop that draws yellow boxes int boxlength; // the calculated average length of each box int extra; // the leftover space for boxes int yladder; //.adders distribute leftover space to boxes int y2adder; mXl = xl + mWidth; //mWidth; mYl = yl; mX2 = mXl + mWidth; //mWidth; mY2 = y2; mpEventQ = apΞventQ; boxlength= ( (mY2-mYl) / (2*mWordSize+l) ) ; extra=(mY2-mYl)%(2*mWordSize+l) ; // the space reserved between ends y2adder=extra/2 ; yladder=extra/2 ; if ( ingrid ) { for (counter = 0;counter<mWordSize;counter++) { vzRegiste .cpp Pin [counter] . DoCreate (counter, in,mXl+3 , mYl+boxleng th+yladder+ (boxlength+boxlength) *counter, mX2-3 ,mYl+boxlength+y2adder+ (boxlength+boxlength) *c ounter+boxlength, mXl+mWidth+3 ,mYl+boxlength+yladder+ (boxlength+boxle ngth) *counter, mXl+2*mWidth-3 ,mYl+boxlength+y2adder+ (boxlength+box length) *counter+boxlength, mWordSize,mpEventQ) ; if (counter==mWordSize-2) { -^ if (extra%2>0) y2adder=extra/2+l; else y2adder=extra/2 ; } > else for (counter = 0; counter<mWordSize;counter++) { mPin [counter] .DoCreate (counter, out, Xl+3,mYl+boxlen gth+yladder+ (boxlength+boxlength) *counter, mX2-3 ,mYl+boxlength+y2adder+ (boxlength+boxlength) *c ounter+boxlength, mXl-mWidth+3 ,mYl+boxlength+yladder+ (boxlength+boxle ngth) *counter, πιXl-3 ,mYl+boxlength+y2adder+ (boxlength+boxlength) *c ounter+boxlengt , mWordSize,mpΞventQ) ; if (counter==mWordSize-2) { if (extra%2>0) y2adder=extra/2+l ; else y2adder=extr /2 ; } } void vzRegister: :DoDraw() { int counter; vzRegister. cpp for (counter = 0;counter<mWordSize;counter++) mPin[counter] .DoDraw() ; void vzRegister : :DoFlood( ) { int counter; for (counter=0; counter<mWordSize; counter++) if (mPin[counter] .GetFlow(true) >0) mPin[counter] .DoFloodO ; void vzRegister: :DoClear ( ) { int counter; for (counter=0 ; counter<mWordSize; counter++) mPin [counter] .DoClear () ; > int vzRegister: : ConnectToPin(vzConnector *pAConnector, int SwitchDe nsity) { int any; int connectorsize; int counter; int whichpin; any = pAConnector->GetY() ; connectorsize = pAConnector->GetSize ( ) ; whichpin=-l; for (counter=0;counter<mWordSize?counter++) { if ( (any>=mPin[counter] .GetOutYl () ) && (any<=mPin[c ounter] .Get0utY2 () ) ) if ( getRandom(100) < SwitchDensity ) whichpin=counter; }_ return whichpin? } vzPin *vzRegister: :GetPinPtr (int i) { return &mPin[i]; } vzRegister. cpp void vzRegister: :DoLabel (bool lefttoright) { int counter; for (counter=0;counter<mWordSize;counter++) mPintcounter] .DoLabel (lefttoright) ; } int vzRegister: :DoAugment( ) { int counter, minflow; for (counter=0 ; counter<mWordSize; counter++) { if ( (mPintcounter] .GetLabel () ) && (mPintcounter] . I sADrain ( ) ) ) { minflow = mPintcounter] .DoAugment (0) ; break; } } return minflow; } bool vzRegister: :CheckLabel ( ) { int counter; int check = 0; for (counter=0;counter<mWordSize;counter++) if (( mPintcounter] .GetLabel () ) && (mPintcounter] . I sADrain () ) ) check++; if ( check > 0 ) return true; else return false; ' } int vzRegister: :0nPin(int xl,int yl) { int j ; int answer; answer=-1; for (j=0; j<mWordSize; ++) vzRegister.cpp if (mPintj] .GetOutXl () <=xl) if (mPin[j] .GetOutX2 ()>=xl) if (mPin[j] .GetOutYl ()<=yl) if (mPintj] .GetOutY2 () >=yl) { answer=j ; break; } } return answer; } void vzRegister: :SetPin(int WhichPin, int flow) { mPin [WhichPin] . SetStart (flow) ; } int vzRegister : :PinHeight (int WhichPin) { return (mPin [WhichPin] .GetOutYl ( ) ) ; } int vzRegister: :GetPinFlow(int WhichPin) { return (mPin [WhichPin] .GetFlow(true) ) ; } void vzRegister: :DeactivatePin(int WhichPin) { mPin [WhichPin] . DeactivatePin () ; } int vzRegister: :GetInitialFlow(int WhichPin) { return (mPi [WhichPin] .GetInitialFlow( ) ) ; } void vzRegister: :ClearStart() { int counter; for (counter=0 ; counter<mWordSize; counter++) mPintcounter] .ClearStartO ; } void vzRegister ::Write (vzString string) { vzRegister . cpp int counter; int size; if ( string. length () < mWordSize ) size = string. length () ; else / size = mWordSize; for (counter=0;counter<size;counter++) if ( string [counter] ==' 0 ' ) mPintcounter] .DeactivatePinO ; else if ( string [counter] ==' 1 ' ) mPintcounter] .SetStart (kStartFlow) ; ***************************************************************** ********* vzRegister.h /* ******************************************************************* ********* vzRegister.h Van Zandt ******************************************************************* ********* */ tif ! defined (_vzRegister_h) tdefine _vzRegister_h tinclude "vzEventQ.h" tinclude "vzPin.h" tinclude "vzConnector.h" tinclude "vzLib\vzString.h" //const int kRegisterWidth=15; class vzRegister { private: const int mWordSize; int mWidth; int mXl ; int mYl ; int mX2 ; int mY2 ; vzPin *mPin; vzEventQ *mpEventQ; bool mAmllnReg; public: vzRegister (int WordSize, int devicesize); -vzRegister () ; void DoCreate (int xl, int yl, int y2, bool ingrid,vzEven tQ *apEventQ) ; void DoDraw( ) ; void DoFlood ( ) ; int ConnectToPin (vzConnector *pAConnector, int SwitchDe nsity) ; void DoClear ( ) ; vzPin *GetPinPtr (int i) ; void DoLabel (bool lefttoright); int DoAugment ( ) ; bool CheckLabel ( ) ; int OnPin ( int xl, int yl) ; void SetPindnt WhichPin, int flow) ; vzRegister.h int PinHeight (int WhichPin); int GetPinFlow(int WhichPin) ; void DeactivatePin(int WhichPin) ; int GetIn.itialFlow(int WhichPin) void ClearStart ( ) ; void Write (vzString string); }; tinclude "vzRegister . cpp" tendif // _vzRegister_h ***************************************************************** ******* ** vzRegister.h /* ******************************************************************* ********* vzRegister .h Van Zandt ******************************************************************* ********* * #if !defined(_vzRegister_h) tdefine _vzRegister_h tinclude "vzEventQ.h" tinclude "vzPin.h" tinclude "vzConnector.h" tinclude "vzLib\vzString.h" //const int kRegisterWidth=15; class vzRegister { private : const int mWordSize; int mW int mXl; int mYl; int mX2; int mY2; vzPin *mPin; vzEventQ *mpEventQ; bool mAmllnReg; public: vzRegister (int WordSize, int devicesize) -vzRegister ( ) ; void DoCreate (int xl, int yl, int y2, bool ingrid,vzEven tQ . *apEventQ) void DoDraw() . ; void DoFlood( ) ; int ConnectToPin (vzConnector *pAConnector, int SwitchDe nsity) void DoClear ( ) ; vzPin *GetPinPtr(int i) ; void DoLabel (bool lefttoright); int DoAugment ( ) ; bool CheckLabel ( ) ; int OnPin(int xl,int yl) ; void SetPin(int WhichPin, int flow); vzRegister.h int PinHeight (int WhichPin); int GetPinFlow(int WhichPin) ; void DeactivatePin(int WhichPin) ; int GetlnitialFlow nt WhichPin) ; void ClearStart ( ) ; void Write (vzString string); }? tinclude "vzRegister .cpp" tendif // _vzRegister_h / ***************************************************************** ********* vzSwitch. cpp /* ******************************************************************* ****** vzSwitch. cpp Van Zandt ******************************************************************* ****** */ vzSwitch: :vzSwitch () { } vzSwitch: : -vzSwitch () { } void vzSwitch: :DoCreate (int xl, int yl, int x2, int y2 , int state, vzEventQ *apEventQ) { mXl = xl; mYl = yl; mX2 = x2; mY2 = y2; mpEventQ = apEventQ; mState = state; if ( mState == 0 ) mlnCapacity = 0; else if (mState==l) mInCapacity=kLowCapacity; else mInCapacity=kHighCapacity; mOutCapacity = mlnCapacity? mlnFlow = 0? mOutFlow = 0; mLabel = false; mpSource = NULL; mTempFlow = 0; mColor = swLowColor; } void vzSwitch: :DoDraw() { int i; vzSwitch. cpp if (mState==2) mColor=swHighColor; if (mState==l) mColor=swLowColor; if (mState==0) mColor=swOffColor; line (screen,mXl ,mYl,mX2 ,mY2 ,mColor) ; for (i=0;i<mNeighborCount;i++) mNeighborArray[i] ->DoDraw( ) ; } void vzSwitch: :DoFlood(] { int i; if ( mColor == swLowColor ) { mColor = swHighColor; if (Trace) DoDraw( ) ; for (i=0; i<mNeighborCount;i++) mpEventQ->UpdateFuture (mNeighborArray [i] ) ; } } void vzSwitch: :DoClear ( ) { mColor = swLowColor; if (Trace) DoDraw( ) ; mLabel = false; mpSource = NULL; mTempFlow = 0; mAddFlow = true; } bool vzSwitch: : GetLabel () { return mLabel; } int vzSwitch: -.GetSpace (bool lefttoright) { if (lefttoright) vzSwitch.cpp return (mlnCapacity-mlnFlow) ; else return (mOutCapacity-mOutFlow) ; } int vzSwitch: :GetFlow(bool lefttoright) { if (lefttoright) return mOutFlow; else return mlnFlow; } void vzSwitch: :GiveFlow(int flow, bool inflow,vzDevice *p) { mpSource = p; mTempFlow = flow; if (inflow) mAddFlow = true; else mAddFlow = false; } int vzSwitch: :DoAugment (int x) { int j ; mColor=swHighColor; if (Trace) DoDraw( ) ; if (mAddFlow) mInFlow=mInFlow+x? else mOutFlow=mOutFlow+x; for (j=0 ; j<mNeighborCount; ++) if (mNeighborArraytj] == mpSource) { mpEventQ->UpdateFuture (mNeighborArray tj ] ) ; break; } return x; } int vzSwitch: : DoLabel (bool lefttoright) vzSwitch. cpp int j, returncode; returncode=0 ; if ( (mLabel==false) && (mTempFlow>0) ) { for (j=0; j<mNeighborCount; j++) { if ( (mNeighborArray [j ] ! =mpSource) && (mNeighb orArray[j ] ->GetLabel ( ) ==false) ) { if (mNeighborArrayt ] ->IsADrain ( ) ) { mNeighborArrayt ] ->GiveFlow(mTempFlow, leftt oright, this) ; returncode = 1; break; } else { mNeighborArraytj ] ->GiveFlow (mTempFlow, lefttoright, this) ; mpEventQ->UpdateFuture (mNeighborArraytj] ) ; } } } mLabel=true; } return returncode? } void vzSwitch: :ClearStart() { mlnFlow = 0 ; mOutFlow = 0; mLabel = false; mpSource = NULL; mTempFlow = 0 ; mColor = swLowColor; void vzSwitch : : ' SetState (int n) { if ( n == 0 ) { mState = 0 ; vzSwitch.cpp mColor = swOffColor; mInCapacity=0 ; } else if ( n == 1 ) { mState = 1; mColor = swLowColor; mInCapacity=kLowCapacity; } else { mState = 2; mColor = swHighColor; mInCapacity=kHighCapacity; } mOutCapacity=mInCapacity; vzSwitch.h /* ******************************************************************* ********* vzSwitch.h Van Zandt ******************************************************************* ********* * tif ! defined (_vzSwitch_h) tdefine _vzSwitch_h tinclude "vzDevice.h" const int swOffColor = DARKGRAY; const int SwLowColor = BLACK; const int swHighColor = WHITE; class vzSwitch: public vzDevice { private : int mXl int mYl int mX2 int mY2 int mColor; vzEventQ *mpEventQ; int mlnCapacity; int mOutCapacity; int mlnFlow; int mOutFlow; bool mLabel ; vzDevice *mpSource; int mTempFlow; bool mAddFlow; int mState; int mNeighborlType; int mNeighborlParml ; int mNeighborlParm2 ; int mNeighbor2Type; int mNeighbor2Parml; int mNeighbor2Parm2 ; public : vzSwitch ( ) ; -vzSwitch () ; void DoCreate (int xl, int yl , int x2 , int y2 , vzSwitch.h int state , vzEventQ *apEven Q) ; void DoDraw( ) ? void DoFlood () ; void DoClear () ; bool GetLabel ( ) ; int GetSpace (bool lefttoright); int GetFlow(bool lefttoright) ; void GiveFlow(int flow, bool inflow, vzDevice *p) ; bool IsADrainO {return false;}; int DoAugment (int x) ; int DoLabel (bool lefttoright); void ClearStart ( ) ; void SetStatednt n) ; void SetNeighborlType int n) ' { mNeighborlType = n; } ; void SetNeighborlParmldnt n) { mNeighborlParml = n; } ; void SetNeighborlParm2.(int n) { mNeighborlParm2 = n; } ; void SetNeighbor2Type(int n) { mNeighbor2Type = n; }; void SetNeighbor2Parml(int n) { mNeighbor2Parml = n; } ; void SetNeighbor2Parm2 (int n) { mNeighbor2Parm2 = n; } ; int GetStateO {return mState; } ; int GetNeighborlType () { return mNeighborlType; ϊ i r int GetNeighborlPar l ( ) { return mNeighborlParm 1 ; } ; int GetNeighborlParm2 ( ) { return mNeighborlParm 2 ; } ; int GetNeighbor2Type ( ) { return mNeighbor2Type; } int GetNeighbor2Parml () { return mNeighbor2Parm 1 ; } . int GetNeighbor2Parm2 ( ) { return mNeighbor2Parm 2 ? } } ? tinclude "vzSwitch. cpp" tendif // _vzSwitch_h Untrained Nanocell Netlist Moletronics .OPTIONS RELTOL=.01 ITL4=10 SCALE=1 POST MΞTHOD=Gear DCSTEP=10 .OPTIONS ACCT=0 INGOLD=l NOMOD PROBE .TRAN lOOOOn 60000n ROutl 1 0 1 .PRINT TRAN I(Routl) Cl 1 0 lOf C2 2 0 lOf C3 3 0 lOf C4 4 0 lOf C5 5 0 lOf C6 6 0 lOf C7 7 0 lOf C8 8 0 lOf C9 9 0 lOf CIO 10 0 lOf Cll 11 0 lOf C12 12 0 lOf C13 13 0 lOf C14 14 0 lOf VInputA15 15 0 PWL(0n,0V 20000n,0V 20001n,0.5V 30000n,0.5V 30001n,2V 40000n,2V + 40001n,0.5V 50000n,0.5V 50001n,0.5V 60000n,0.5V ) .PRINT TRAN 15 C15 15 0 lOf C16 16 0 lOf C17 17 0 lOf C18 18 0 lOf C19 19 0 lOf C20 20 0 lOf C24 24 0 5f C27 27 0 5f C29 29 0 5f C32 32 0 5f C34 34 0 5f C35 35 0 5f C37 37 0 5f C39 39 0 5f C42 42 0 5f C44 44 0 5f C47 47 0 5f C49 49 0 5f C50 50 0 5f C52 52 0 5f C53 53 0 5f C54 54 0 5f C55 55 0 5f C56 56 0 5f C57 57 0 5f C58 58 0 5f C59 59 0 5f C60 60 0 5f C61 61 0 5f C62 62 0 5f C63 63 0 5f C64 64 0 5f C67 67 0 5f C68 68 0 5f C69 69 0 5f C70 70 0 5f C71 71 0 5f C72 72 0 5f C74 74 0 5f C75 75 0 5f C76 76 0 5f C77 77 0 5f C78 78 0 5f C79 79 0 5f C82 82 0 5f C83 83 0 5f C84 84 0 5f C85 85 0 5f C86 86 0 5f C87 87 0 5f C88 88 0 5f C89 89 0 5f C90 90 0 5f C92 92 0 5f C93 93 0 5f C94 94 0 5f C97 97 0 5f C99 99 0 5f ClOl 101 0 5f C102 102 0 5f C103 103 0 5f C104 104 0 5f C105 105 0 5f C106 106 0 5f C108 108 0 5f C109 109 0 5f cm in o 5f C112 112 0 5f C113 113 0 5f C114 114 0 5f C115 115 0 5f C116 116 0 5f C119 119 0 5f C120 120 0 5f C121 121 0 5f C122 122 0 5f C123 123 0 5f C124 124 0 5f C125 125 0 5f C128 128 0 5f C129 129 0 5f C130 130 0 5f C131 131 0 5f C132 132 0 5f C133 133 0 5f C134 134 0 5f C135 135 0 5f C136 136 0 5f C137 137 0 5f C138 138 0 5f C139 139 0 5f C142 142 0 5f C143 143 0 5f C144 144 0 5f C145 145 0 5f C146 146 0 5f C147 147 0 5f C149 149 0 5f C150 150 0 5f C151 151 0 5f C152 152 0 5f C153 153 0 5f C154 154 0 5f C157 157 0 5f C158 158 0 5f C159 159 0 5f C160 160 0 5f C161 161 0 5f C162 162 0 5f C163 163 0 5f C164 164 0 5f C165 165 0 5f C166 166 0 5f C167 167 0 5f C168 168 0 5f C169 169 0 5f C172 172 0 5f C173 173 0 5f C175 175 0 5f C176 176 0 5f C178 178 0 5f C179 179 0 5f C180 180 0 5f C181 181 0 5f C182 182 0 5f C183 183 0 5f C184 184 0 5f C186 186 0 5f C187 187 0 5f C188 188 0 5f C190 190 0 5f C191 191 0 5f C192 192 0 5f C193 193 0 5f C194 194 0 5f C195 195 0 5f C196 196 0 5f C197 197 0 5f C198 198 0 5f C199 199 0 5f C200 200 0 5f C202 202 0 5f C203 203 0 5f C204 204 0 5f C205 205 0 5f C206 206 0 5f C207 207 0 5f C208 208 0 5f C209 209 0 5f C210 210 0 5f C212 212 0 5f C214 214 0 5f C217 217 0 5f C219 219 0 5f C222 222 0 5f C224 224 0 5f C229 229 0 5f C231 231 0 5f C232 232 0 5f C234 234 0 5f C237 237 0 5f C239 239 0 5f C242 242 0 5f C244 244 0 5f X512 20 244 NDRDIODE_0 X511 242 20 NDRDI0DE_1 X510 19 242 NDRDIODE_0 X508 239 19 NDRDIODE_0 X507 18 239 NDRDIODE_l X506 237 18 NDRDIODE_0 X505 237 17 NDRDIODE_0 X503 234 17 NDRDIODE_l X502 234 16 NDRDIODE_l X501 16 232 NDRDIODE_0 X500 232 231 NDRDIODE_l X499 5 229 NDRDIODE_l X498 229 244 NDRDIODE_0 X497 20 229 NDRDIODE_0 X496 20 229 NDRDIODE_0 X490 239 19 NDRDIODE_l X489 224 19 NDRDIODE_l X488 224 239 NDRDIODE_0 X487 18 224 NDRDIODE_0 X486 18 239 NDRDIODE_0 X484 18 237 NDRDIODE_0 X483 222 18 NDRDIODE_0 X482 237 222 NDRDIQDE_1 X481 222 17 NDRDIODE_0 X480 237 17 NDRDIODE_l X475 219 17 NDRDIODE_l X474 219 17 NDRDIODE_0 X473 219 234 NDRDIODE_l X472 219 16 NDRDIODE_0 X471 16 219 NDRDIODE_l X469 217 16 NDRDIODE_0 X468 217 16 NDRDIODE_0 X467 217 232 NDRDIODE_0 X466 217 231 NDRDIODE_0 X465 10 231 NDRDIODE_0 X464 10 217 NDRDIODE_l X462 214 5 NDRDIODE_0 X461 214 5 NDRDIODE_l X460 214 229 NDRDIODE_l X459 214 20 NDRDIODE_l X458 212 20 NDRDIODE_0 X457 212 19 NDRDIODE_0 X456 210 19 NDRDIODE_0 X455 19 210 NDRDIODE_0 X454 210 224 NDRDIODE_0 X453 210 209 NDRDIODE_0 X452 209 224 NDRDIODE_0 X451 209 208 NDRDIODE_l X450 224 208 NDRDIODE_0 X449 18 208 NDRDIODE_0 X448 222 208 NDRDIODE_l X447 207 208 NDRDIODE_0 X446 222 207 NDRDIODE_0 X445 207 206 NDRDIODE_0 X444 206 222 NDRDIODE_0 X443 206 17 NDRDIODE_0 X442 206 17 NDRDIODE_0 X441 206 205 NDRDIODE_0 X440 205 17 NDRDIODE_0 X439 204 205 NDRDIODE_0 X438 17 204 NDRDIODE_l X437 204 219 NDRDIODE_0 X436 16 204 NDRDIODE_l X435 203 204 NDRDIODE_0 X434 203 16 NDRDIODE_l X433 203 202 NDRDIODE_0 X432 16 202 NDRDIODE_l X431 217 202 NDRDIODE_0 X430 202 10 NDRDIODE_l X428 10 202 NDRDIODE_l X427 200 5 NDRDIODE_l X426 199 200 NDRDIODE_0 X425 199 5 NDRDIODE_0 X424 199 214 NDRDIODE_0 X423 199 198 NDRDIODE_0 X422 197 198 NDRDIODE_l X421 212 197 NDRDIODE_l X420 196 197 NDRDIODE_0 X419 195 196 NDRDIODE_l X418 195 210 NDRDIODE_0 X417 195 209 NDRDIODE_0 X416 194 195 NDRDIODE_0 X415 194 209 NDRDIODE_l X414 194 193 NDRDIODE_l X413 193 209 NDRDIODE_l X412 193 208 NDRDIODE_0 X411 207 193 NDRDIODE_l X410 193 192 NDRDIODE_0 X409 207 192 NDRDIODE_l X408 191 192 NDRDIODE_0 X407 207 191 NDRDIODE_0 X406 191 206 NDRDIODE_l X405 205 191 NDRDIODE_0 X404 190 191 NDRDIODE_0 X403 205 190 NDRDIODE_0 X402 188 203 NDRDIODE_l X401 188 187 NDRDIODE_l X400 187 203 NDRDIODE_l X399 202 187 NDRDIODE_l X398 10 187 NDRDIODE_0 X397 186 10 NDRDI0DE_1 X396 187 186 NDRDIODE_0 X395 200 4 NDRDIODE_0 X394 4 184 NDRDIODE_l X393 184 200 NDRDIODE_0 X392 184 199 NDRDIODE_0 X391 184 198 NDRDIODE_0 X390 183 184 NDRDIODE_0 X389 198 183 NDRDIODE_l X388 183 182 NDRDIODE_0 X387 182 198 NDRDIODE_l X386 197 182 NDRDIODE_l ' X385 182 196 NDRDIODE_0 X384 182 181 NDRDIODE_0 X383 196 181 NDRDIODE_l X382 181 180 NDRDIODE_0 X381 196 180 NDRDIODE_l X380 195 180 NDRDIODE_l X379 194 180 NDRDIODE_l X378 179 180 NDRDIODE_l X377 179 194 NDRDIODE_0 X376 179 178 NDRDIODE_0 X375 178 194 NDRDIODE_l X374 178 193 NDRDIODE_l X373 192 178 NDRDIODE_l X372 192 176 NDRDIODE_0 X371 191 176 NDRDIODE_0 X370 190 176 NDRDIODE_0 X369 175 176 NDRDIODE_0 X368 190 175 NDRDIODE_l X367 188 173 NDRDIODE_0 X366 173 172 NDRDIODE_0 X365 188 172 NDRDIODE_0 X364 172 187 NDRDIODE_0 X363 172 186 NDRDIODE_0 X362 186 9 NDRDIODE_0 X361 9 172 NDRDIODΞ_l X359 169 4 NDRDIODE_0 X358 169 4 NDRDIODE_l X357 184 169 NDRDIODE_0 X356 183 169 NDRDIODE_0 X355 168 169 NDRDIODE_l X354 183 168 NDRDIODE_l X353 167 168 NDRDIODE_l X352 167 183 NDRDIODE_0 X351 167 182 NDRDIODE_l X350 181 167 NDRDIODE_0 X349 167 166 NDRDIODE_0 X348 181 166 NDRDIODE_l X347 165 166 NDRDIODE_l X346 181 165 NDRDIODE_l X345 165 180 NDRDIODE_0 X344 179 165 NDRDIODE_l X343 165 164 NDRDIODE_l X342 179 164 NDRDIODE_l X341 164 163 NDRDIODE_0 X340 179 163 NDRDIODE_0 X339 178 163 NDRDIODE_0 X338 162 163 NDRDIODE_l X337 162 161 NDRDIODE_l X336 161 176 NDRDIODE_l X335 161 175 NDRDIODE_l X334 161 160 NDRDIODΞ_0 X333 175 160 NDRDIODE_l X332 160 159 NDRDIODE_0 X331 159 175 NDRDIODE_l X330 173 159 NDRDIODE_l X329 158 159 NDRDIODE_0 X328 158 173 NDRDIODE_l X327 158 157 NDRDIODE_0 X326 157 173 NDRDIODE_0 X325 157 172 NDRDIODE_0 X324 157 9 NDRDIODE_0 X322 157 9 NDRDIODE_l X320 3 154 NDRDIODE_l X319 154 4 NDRDIODE_0 X318 154 169 NDRDIODE_0 X317 168 154 NDRDIODE_l X316 153 154 NDRDIODE_l X315 168 153 NDRDIODE_0 X314 152 153 NDRDIODE_0 X313 152 168 NDRDIODE_0 X312 152 167 NDRDIODE_0 X311 152 166 NDRDIODE_l X310 152 151 NDRDIODE_l X309 151 166 NDRDIODE_0 X308 150 151 NDRDIODE_l X307 166 150 NDRDIODE_l X306 165 150 NDRDIODE_l X305 164 150 NDRDIODE_l X304 150 149 NDRDIODE_0 X303 149 164 NDRDI0DE_1 X302 147 162 NDRDIODE_0 X301 147 146 NDRDIODE_0 X300 162 146 NDRDIODE_0 X299 146 161 NDRDIODE_l X298 146 160 NDRDIODE_l X297 145 146 NDRDIODE_0 X296 145 160 NDRDIODE_l X295 144 145 NDRDIODE_0 X294 160 144 NDRDIODE_l X293 144 159 NDRDIODE_l X292 144 158 NDRDIODE_0 X291 143 144 NDRDIODE_l X290 158 143 NDRDIODE_l X289 143 142 NDRDIODE_0 X288 158 142 NDRDIODE_0 X287 157 142 NDRDIODE_0 X286 9 142 NDRDIODE_0 X284 8 142 NDRDIODE_0 X282 139 3 NDRDIODE_l X281 3 139 NDRDIODE_0 X280 139 154 NDRDIODE_l X279 139 153 NDRDIODE_l X278 139 138 NDRDIODE_l X277 138 153 NDRDIODE_l X276 137 138 NDRDIODE_l X275 137 153 NDRDIODE_l X274 152 137 NDRDIODE_0 X273 151 137 NDRDIODE_l X272 136 137 NDRDIODE_0 X271 136 151 NDRDIODE_0 X270 136 135 NDRDIODE_l X269 151 135 NDRDIODE_l X268 150 135 NDRDIODE_0 X267 149 135 NDRDIODE_0 X266 135 134 NDRDIODE_0 X265 134 149 NDRDIODE_l X264 134 133 NDRDIODΞ_l X263 133 149 NDRDIODE_0 X262 133 147 NDRDIODE_0 X261 132 133 NDRDIODE_0 X260 147 132 NDRDIODE_0 X259 131 132 NDRDIODE_l X258 147 131 NDRDIODΞ 0 C5 o EΛ H U α. C5 O CΛ H U α. o o o o o 1 1 1 1 1 1 1 1 1 H H H H H M H H w P R P P P P P P P O O O O O O O O O H H H H H H H H H P R P R P P P P P Pi Pi Pi Pi Pi Pi Pi Pi Pi P P P P P P R R P £ £ £ £ £ £ £ £ £ σs in σs CM H vo H co c- oo P~ c- r~ in •* l r~ o r~ 00 r- r- r- o o σs r- in ΓO ro ro ro ro ro ro ro X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X σs σs 1 -J o -o -J 00 00 co CO 00 00 CO 00 CO 00 vo vo vo o vo vo vo vo o vo l- 1 H 1 l- » ι-> H 1 H 1 I- 1 l- 1 t- » t-> H 1 H 1 H 1 I- 1 h^ t-> H 1 l-> I- 1 l-» H» f- » ι-> H» H-> ι-> co vo o I- 1 t OJ it* Ul σs VO o to OJ if* Ul σs -J CO vo o t OJ it* Ul σs -J CO vo σ O o o O O o o o O f-> H 1 l- > -> tSJ t to to to to to t ISJ oo o l- » t 0J it* ui σs ! CO VO O (-> ISO 0J it* Ul σs -J VO I- 1 to 0J if* ui σs -J co o o σs I- 1 H (-> σs σs it* Π σs Ul σs σs ui σs ui ui σs -J ui ui Ul Ul ui -J ui -o ui -J ui ui LO cπ Ul Ul OJ it* vo o tsj 00 t co it* it* vo o it* Ul σs σs σs to σs t -J ISO co vo ui ui ^ it. σs if* it it* I- 1 it* o t C Ul on Ul Ul Ul σs ui ui Ul ui Ul Ul Ul ui Ul Ul ~J O VO vo VO vo t isj CO OJ J 00 H 1 σs -J -J 00 CO it* 00 £ £ it* it* ui o Ul o £ £ £ £ £ £ s £ d £ d d α £ £ g £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ d d d d o d IS d pa pa pa d D o d d α d D d D d d d d d d D d d pa V ?a ?a Pd Pd d SO d d d pa pa pa a pa ?a pa V ?d V ?a pa PO a d pa pa pa pa α ?a d d D d d d H d H H H O α d d d α d O d d d d d d d d d H H H H H H O H O O o H H H H H H H H H α H H H H H H H α d H H H H O O O o O O d o d α D o O O O O o O O O O O d d d M d M M M D d d d od d d o O O O o O O O d d d d d d d H M Mα Mα M H 1 M I α d d d 1 1 M M M M α M M M M M M M M α M M M M M M α M 1 1 1 1 1 1 l-> 1 o h- 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 H 1 l-> o l- » o H» o o o o H 1 o H> o o o o H 1 H > ι-> H> o o o 90 O M £ ti C < < I < o 3 .SUBCKT NDRDIODE_0 IN OUT Gl IN OUT P L(l) IN OUT -2V,-.8n -IV, - .8n -.75V,-.55n -.5V,-.21n 0V,0n .5V, .21n .75V, .55n IV, .8n 2V, .8n SMOOTH=l .ENDS .END Inverter Netlist Moletronics .OPTIONS RELTOL=.01 ITL4=10 SCALE=1 POST METHOD=Gear DCSTEP=10 .OPTIONS ACCT=0 INGOLD=l NOMOD PROBE .TRAN lOOOOn 60000n ROutl 1 0 1 . PRINT TRAN I(Routl) Cl 1 0 lOf C2 2 0 lOf C3 3 0 lOf C4 4 0 lOf C5 5 0 lOf C6 6 0 lOf C7 7 0 lOf C8 8 0 lOf C9 9 0 lOf CIO 10 0 lOf Cll 11 0 lOf C12 12 0 lOf C13 13 0 lOf C14 14 0 lOf VInputA15 15 0 PWL(0n,0V 20000n,0V 20001n,0.5V 30000n,0.5V 30001n,2V 40000n, ,2V + 40001n,0.5V 50000n,0.5V 50001n,0.5V 60000n,0.5V ) . PRINT TRAN 15 C15 15 0 lOf C16 16 0 lOf C17 17 0 lOf C18 18 0 lOf C19 19 0 lOf C20 20 0 lOf C24 24 0 5f C27 27 0 5f C29 29 0 5f C32 32 0 5f C34 34 0 5f C35 35 0 5f C37 37 0 5f C39 39 0 5f C42 42 0 5f C44 44 0 5f C47 47 0 5f C49 49 0 5f C50 50 0 5f C52 52 0 5f C53 53 0 5f C54 54 0 5f C55 55 0 5f C56 56 0 5f C57 57 0 5f C58 58 0 5f C59 59 0 5f C60 60 0 5f C61 61 0 5f C62 62 0 5f C63 63 0 5f C64 64 0 5f C67 67 0 5f C68 68 0 5f C69 69 0 5f C70 70 0 5f C71 71 0 5f C72 72 0 5f C74 74 0 5f C75 75 0 5f C76 76 0 5f C77 77 0 5f C78 78 0 5f C79 79 0 5f C82 82 0 5f C83 83 0 5f C84 84 0 5f C85 85 0 5f C86 86 0 5f C87 87 0 5f C88 88 0 5f C89 89 0 5f C90 90 0 5f C92 92 0 5f C93 93 0 5f C94 94 0 5f C97 97 0 5f C99 99 0 5f ClOl 101 0 5f C102 102 0 5f C103 103 0 5f C104 104 0 5f C105 105 0 5f C106 106 0 5f C108 108 0 5f C109 109 0 5f Clll 111 0 5f C112 112 0 5f C113 113 0 5f C114 114 0 5f C115 115 0 5f C116 116 0 5f C119 119 0 5f C120 120 0 5f C121 121 0 5f C122 122 0 5f C123 123 0 5f C124 124 0 5f C125 125 0 5f C128 128 0 5f C129 129 0 5f C130 130 0 5f C131 131 0 5f C132 132 0 5f C133 133 0 5f C134 134 0 5f C135 135 0 5f C136 136 0 5f C137 137 0 5f C138 138 0 5f C139 139 0 5f C142 142 0 5f C143 143 0 5f C144 144 0 5f C145 145 0 5f C146 146 0 5f C147 147 0 5f C149 149 0 5f C150 150 0 5f C151 151 0 5f C152 152 0 5f C153 153 0 5f C154 154 0 ' 5f C157 157 0 5f C158 158 0 5f C159 159 0 5f C160 160 0 5f C161 161 0 5f C162 162 0 5f C163 163 0 5f C164 164 0 5f C165 165 0 5f C166 166 0 5f C167 167 0 5f C168 168 0 5f C169 169 0 5f C172 172 0 5f C173 173 0 5f C175 175 0 5f C176 176 0 5f C178 178 0 5f C179 179 0 5f C180 180 0 5f C181 181 0 5f C182 182 0 5f C183 183 0 5f C184 184 0 5f C186 186 0 5f C187 187 0 5f C188 188 0 5f C190 190 0 5f C191 191 0 5f C192 192 0 5f C193 193 0 5f C194 194 0 5f C195 195 0 5f C196 196 0 5f C197 197 0 5f C198 198 0 5f C199 199 0 5f C200 200 0 5f C202 202 0 5f C203 203 0 5f C204 204 0 5f C205 205 0 5f C206 206 0 5f C207 207 0 5f C208 208 0 5f C209 209 0 5f C210 210 0 5f C212 212 0 5f C214 214 0 5f C217 217 0 5f C219 219 0 5f C222 222 0 5f C224 224 0 5f ιt* ,t* ,f* ,f* ,t* t£* xxxx ιxf*-ιxt* ιxt* ιxt* 1 xt* uxι cxπ cxπ cxπ cxπ cxπ cxπ cxπ cxπ cxπ cxn tno tno tno coo ιnnn ιt* ιt* ιt* ιt* cn cπ o o o o o o o μ- > μ-> μ-> ιt* ιt* co co co co co t oi j co iD o μ os ' J iD Vo o o -j iϊ VD o μ-> to co uι σs -J co o μ-> tθ ιt* ιo vo ~J it* to μ- 1 to i\J to to to to to o o o o o o o cn cn ui ui ui ui ui Mi l-ii h l-h Mi rti hh X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X co co oo vo vo vo o vo vo vo vo vo vo o o o o o o μ-> μ- 1 μ- 1 μ-> μ-> t to to to to to to ui σs vo o μ-> to σs vo o to σs o o t σs vo o μ-> to ui σs co o to cπ σs vo μ- 1 c H μ- 1 μ-> μ-> μ-> μ-> μ-> μ-> to μ-> to μ-> μ-> μ-> t μ- 1 to (-> t to F-> μ- 1 μ- 1 μ-> μ-> μ-> μ-> μ-> to μ-> M μ-> to t μ-> to to to μ- 1 μ-> to to w to to t t oo oo vo vo o oo o o co o vo o o vo o vo o vo o vo μ-> o vo vo o o μ-> σs o o o σs o o o o to to t μ-> o σs to o μ-> cπ σs to vo vo vo cπ σs σs σs σs t to to t μ^ !-> μ- 1 μ-> μ- μ- 1 μ-> to μ-> t μ- 1 to μ- 1 μ- 1 μ- 1 μ-> μ-> μ-> to to μ- > to μ-> to to μ-> μ-> μ- 1 μ- 1 to ui to o μ-> to o to to o t o to t μ- 1 μ-> to t vo vo co o vo o o o vo o o o vo vo vo vo o o o o o μ^ vo vo vo vo μ-> o to o o to o σs o μ-> o o to σs to to co vo o £ £ σs oo o μ-> μ-> σs to t to co vo co vo vo o σs £ o £ to t vo cπ cπ t σ d d £ £ d d £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ pa pa £ d α £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ pa £ pa d d £ d £ α £ d £ d £ d £ d d £ £ d d a O d d d d d d d d d pa pa d d d α d d d d d d α d d d d d d d d d d d d α α d α d a pa pa d pa d V d pa d pa O pa d ?a pa α d d Pd ?d ?a pa pa V pa pa pa Pd d d pa pa pa pa Pd d Pd pa d d pa pa pa pa pa pa pa pa pa pa pa pa Pd pa pa ?a pa d d pa d V α pa d pa d pa d ?a O D pa P3 d d d D d d d d d d o o d d d d d d d d d d d α d d d d d d d d d d d d d d d o d o d d d d d d d d d d o o H H d d O O O O H o O O H O O O O O o O O O O O O ra ra O D D O O O O O O O O O O o o O O O O O O O O O o O o o O H O M d d O D O d O d o d O d O d d o O d d α d d d d d o O 1 1 d H ra d d d d d d d α d d α d d o α d d d d α d d d o d O 1 d 1 ra M d H d M d M d ra a M d M ra d d ra M ra ra M ra ra M M M o ra i 1 M ra M ra ra M H ra ra ra ra ra M ra ra M M M M ra ra ra ar ra M ra μ- 1 M 1 1 ra I ra i M 1 M 1 ra 1 H 1 1 ra M 1 1 1 1 1 1 1 1 1 1 1 μ-> μ- 1 1 I 1 1 1 1 1 1 1 I 1 1 1 1 1 1 1 1 1 1 1 1 I 1 1 1 | o μ- 1 1 1 μ-> 1 o o o o o o μ-> > o o o o o 1 1 1 o 1 1 o o μ-> o μ- 1 o » μ- 1 μ-> μ-> o o o o μ- μ-> μ- 1 o μ- 1 o μ-> o σ o μ-> o o ^ 90 -4 X383 196 181 NDRDIODE_l X382 181 180 NDRDIODE_l X381 196 180 NDRDIODE_l X380 195 180 NDRDIODE_0 X379 194 180 NDRDIODE_l X378 179 180 NDRDIODE_l X377 179 194 NDRDIODE_l X376 179 178 NDRDIODE_0 X375 178 194 NDRDIODE_l X374 178 193 NDRDI0DE_1 X373 192 178 NDRDIODE_l X372 192 176 NDRDIODE_l X371 191 176 NDRDIODE_0 X370 190 176 NDRDIODE_0 X369 175 176 NDRDIODE_l X368 190 175 NDRDIODE_0 X367 188 173 NDRDIODE_l X366 173 172 NDRDIODE_0 X365 188 172 NDRDIODE_l X364 172 187 NDRDIODE_l X363 172 186 NDRDIODΞ_l ' X362 186 9 NDRDIODE_0 X361 9 172 NDRDIODE_l X359 169 4 NDRDIODE_l X358 169 4 NDRDIODE_l X357 184 169 NDRDIODΞ_0 X356 183 169 NDRDIODE_l X355 168 169 NDRDIODE_l X354 183 168 NDRDIODE_0 X353 167 168 NDRDIODE_l X352 167 183 NDRDIODE_0 X351 167 182 NDRDIODE_l X350 181 167 NDRDIODE_l X349 167 166 NDRDIODE_l X348 181 166 NDRDIODE_l X347 165 166 NDRDIODE_l X346 181 165 NDRDIODE_l X345 165 180 NDRDIODE_0 X344 179 165 NDRDIODE_0 X343 165 164 NDRDIODE_l X342 179 164 NDRDIODE_l X341 164 163 NDRDIODE_0 X340 179 163 NDRDIODE_0 X339 178 163 NDRDIODE_0 X338 162 163 NDRDIODE_l X337 162 161 NDRDIODE_0 X336 161 176 NDRDIODΞ_l X335 161 175 NDRDIODE_0 X334 161 160 NDRDIODE_l X333 175 160 NDRDIODE_l X332 160 159 NDRDIODE_l X331 159 175 NDRDIODE_0 X330 173 159 NDRDIODE_0 X329 158 159 NDRDIODE_l X328 158 173 NDRDIODE_l X327 158 157 NDRDIODE_l X326 157 173 NDRDIODE_l X325 157 172 NDRDIODE_l X324 157 9 NDRDIODE_l X322 157 9 NDRDIODE_0 X320 3 154 NDRDIODE_l tO tO tO tO tO lO NJ tO tO tO INJ INJ tO tO INO INJ tO tO IO lNJ O tO tO tO IO tO M tO tO tO INJ NJ tO tO tO tO tO t ^ cπ uι uι c^ σs σs σs σs cn σs σs σι σs ι ι -j -j -j ι ι ι ι ι co cD θo oo co ca c» cn vo vo vD v^ μ- > μ l CX> V0 O ^ tO C0 it* Cn cn -J CX3 V0 CD t0 C0 |t* cn Ci^ l C0 V0 O t if* cn l C0 V0 O t0 C0 i^ -J CO v μ- 1 μ- > μ- » μ-> μ-> μ- 1 μ-> μ-> μ-> μ-> μ^ μ-> μ-> μ-> μ μ μ μ-> μ-> h- > μ- 1 co μ co co co oo ,t* ui co cπ Cπ co co co cπ as μ- > -J t CO CO if* if* ui vo o μ-> s s σs μ-> INJ -o -o vo vo μ-> Jιt** ιιt μ- 1 μ-> μ-> μ-> ι-> μ μ μ μ μ μ μ H ι- » μ- 1 μ-> μ-> μ-> μ- > vo co to l- 1 it if* if* CO if* OJ OJ CO cπ co co co cπ co cπ cπ μ-> μ-> -j vo vo it* cπ cπ cπ cπ μ-> -j -J -J CO CO co £ d £ £ £ £ £ £ £ £ £ £ £ £ £ Pd Pd d D α d d d d d _ d d _ α d d d d d d pa pa pa pa pa pa pa d ?d Pd pd pd pd pd pd pd Pd d ? ?dd d d d d d d d d d d d d d π d d d d d dd H H H H H H H H H H H H o o o o O O o o O O O o o O O O o O OO t M d d d d d d d d d d d ti tl d d d d d αα I I ,ra ra ra ra ra ra ra M ra ra ra ra ra ra ra ra M ra ra r o μ-> o I I I I I I Ia I rara . l l l l ■ I I I I I 1 1 I I o o o o o μ-> μ- 1 o μ-> o o I I I I I μ- 1 o o H 1 o o X256 131 145 NDRDIODE_l X255 131 130 NDRDIODE_0 X254 145 130 NDRDIODE_0 X253 130 129 NDRDIODE_l X252 129 145 NDRDIODE_l X251 129 144 NDRDIODE_0 X250 143 129 NDRDIODE_l X249 128 129 NDRDIODE_0 X248 143 128 NDRDIODE_0 X246 3 125 NDRDIODE_0 X245 124 125 NDRDIODE_0 X244 3 124 NDRDIODE_0 X243 124 139 NDRDIODE_l X242 138 124 NDRDIODE_l X241 124 123 NDRDIODE_0 X240 138 123 NDRDIODE_l X239 122 123 NDRDIODE_0 X238 122 138 NDRDIODE_0 X237 122 137 NDRDIODE_l X236 136 122 NDRDIODE_l X235 121 122 NDRDIODE_l X234 121 136 NDRDIODE_0 X233 121 120 NDRDIODE_l X232 136 120 NDRDIODE_l X231 120 135 NDRDIODE_l X230 120 134 NDRDIODE_l X229 120 119 NDRDIODE_0 X228 134 119 NDRDIODE_0 X227 115 116 NDRDIODE_0 X226 115 130 NDRDIODE_l X225 114 115 NDRDIODE_l X224 114 130 NDRDIODE_0 X223 129 114 NDRDIODE_0 X222 114 128 NDRDIODE_l X221 113 114 NDRDIODE_0 X220 113 128 NDRDIODE_0 X219 112 113 NDRDIODE_l X218 112 128 NDRDIODE_l X217 112 8 NDRDIODE_l X216 111 8 NDRDIODE_l X215 112 111 NDRDIODE_0 X214 2 125 NDRDIODΞ_0 X213 2 109 NDRDIODE_0 X212 125 109 NDRDIODE_0 X211 109 124 NDRDIODE_l X210 109 123 NDRDIODE_0 X209 108 109 NDRDIODE_0 X208 123 108 NDRDIODE_l X207 121 106 NDRDIODE_0 X206 106 105 NDRDIODE_0 X205 121 105 NDRDIODΞ_0 X204 120 105 NDRDIODE_l X203 119 105 NDRDIODE_0 X202 105 104 NDRDIODE_0 X201 119 104 NDRDIODE_0 X200 104 103 NDRDIODE_0 XI99 103 119 NDRDIODE_l XI98 102 103 NDRDIODE_0 XI97 101 102 NDRDIODE_l X196 101 116 NDRDIODE_l X195 115 101 NDRDIODE 1 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X μ- 1 μ^ μ-> μ-> μ-> μ-> μ-> μ-> μ- 1 μ-> μ- 1 μ- » μ- 1 μ- > μ- > μ-> μ-> μ^ μ- 1 μ-> μ-> μ- 1 μ-> μ- 1 μ- » μ- 1 μ-> μ-> μ-> μ-> μ-> μ- 1 μ- 1 μ- 1 μ- 1 cπ cπ cπ cπ cπ Cπ cπ σs σs σs σs s σs σs σs σs s -o. ι co oo co co vo o vo vo μ-> to cπ σs oo vo o μ-> to cπ σs co o μ-> to σs o I- 1 t σs co vo o μ- » w co cπ σs o co o μ- 1 to co cπ co to co co vo ι o vo to oo co co oo co μ-> μ-> vo μ- 1 vo vo o vo t cπ o μ-> to o σs oo co t to s o σs σs oo o o o o o o -o μ- 1 cπ crs vo -J vo vo to o μ-> μ-> co μ- 1 t- » vo μ-> vo μ-> vo μ- 1 μ- 1 o μ- 1 ui σs μ-> μ-> to vo cπ vo cπ cπ σs co vo vo to oo en cπ 03 o o O o co co o o vo vo vo vo to o o o £ £ £ £ σs t NJ to if* vo it* o O to vo £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ d d d d £ £ £ £ £ £ £ £ £ £ £ £ 3 d d d d d d d d d d d d d d d d d d d d d Pd pa a d a d d d d £ £ d £ d £ £ £ d £ d £ £ £ £ £ d £ D £ £ Pd V d Pd Pd Pd pa Pd Pd Pd ?d ?d Pd Pd Pd Pd Pd pa Pd pa V d d d d pa V d Pd ?d ?d d d Pd d d d d d d d Pd d d d d d Pd D Pd d d d d d d d d d d d d d d d d d d d d d d d d d d d d d Pd Pd d Pd d Pd Pd Pd d d d Pd Pd ?d pd Pd d Pd d Pd Pd o o O O d d d d d d d d d d d d d d d O o o O O O o O O O O O O O o o o O O o o d d d d o o o O O O o o o o o O d d d d d d d d d d d d d d d d d d d d d M M ra M d d d d d d O o d O d O O O d o d O O O o O d O d O O M ra ra ra , M M ra ra ra ra ra M M M ra ra ra ra M ra ra i 1 1 1 M M M M M M d d ra d ra d d d M d ra d d d d D ra d M d d 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 o o μ-> o 1 1 1 1 1 1 ra ra I M 1 ra ra ra I ,M 1 ra M H ra ,ra I ,ra l M o ra μ-> μ-> o o o o μ- 1 μ- » μ-> μ-> o o o o o o μ-> o μ- 1 μ-> o o o o μ-> 1 1 μ-> I o 1 1 1 μ-> 1 o 1 1 1 1 1 μ-> 1 o 1 o o μ- > o o μ- > o o σ o o 1 o o X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X σs σs σs -j -j ~o -o -j -0 -j -o -j co CO 00 CO CO CO co 00 co 00 vo vo vo VO vo vo vo vo vo vo μ-> μ-> μ-> μ-> μ- > μ-> -> μ- 1 μ- > μ-> μ- > - 1 μ- > μ-> μ-> μ- > μ- 1 μ- 1 μ-> μ- 1 μ-> μ- > μ- > μ- 1 μ-> -j co vo o μ-> to 00 if* Ul s -j vo o μ- > to CO if* Ul σs -J CO vo o μ-> t CO it* Ul σs -J 03 vo o o O o μ- 1 to NJ to to to t t to to o t it* Ul t CO it* en μ- 1 to 00 it* en crs -j vo σs σs μ-> μ- 1 μ-> σs σs it* ui μ- > σs Ul σs σs cπ σs cπ Ul σs -J cπ cπ ui cπ cπ -J cπ I Ul ~J cπ en to CO Ul cπ Ul OJ it* vo o to ~j CO to CO it* it* vo o if* cπ σs σs σs to σs t ~j to 00 vo en en -j σs -j σs -J σs σs σs -o σs -j σs σs -j σs σs σs ~j σs CO σs CO σs σs σs oo ui ui vo vo it* o σs O σs t to to 03 CO 00 co it* vo if* it* -j OJ co CO 03 vo vo cπ it* it* it* σs it* it* if* R if* o t σs Ul cπ cπ cπ Ul σs Ul Ul cπ -o en -j -j cπ cπ Ul Ul ui -j en σs σs -j -j -J OJ VO vo VO VO to to CO CO CO 00 if* it* Ul CD Ul o μ-> σs -J -J CO CO it* CO -j σs σs σs σs σs σs r- 1 -j -j σs σs σs σs 00 σs £ £ £ £ if* o o σs to to if* 00 if* vo it* vo £ £ £ £ £ £ £ d £ d d d £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ d d d α d α d pa d Pd Pd Pd d d d d d α d α D d d d d d d d d d d d £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ d d d d £ £ £ £ 2 pjj 2 pjj pa V pa pa pa V pa d ?d d d d Pd Pd ?d Pd Pd Pd pa pa pa V pa pa Pd Pd Pd Pd d Pd d - Pd d d d d d d d d d d d d d d d d V V pa pa d d d d Q Q o 3 d d d d d Ό d H d H H H d d d d d d d d d d d d d d d d d d d d pa pa pa pa d ?d ?d Pd Pd Pd ?a V pa pa pa V d a d d •pi V pa pa pa pa pa pa H H H H H H H o H o O o H H H H H H H H H H H H H H H H H H H H o d d d d d d d d d d O a d d d d d H H H H d d d o d d d d d O O o o d O d d d O O O O O O O O O O O o O O O O o O o O H H H H H H H H H H H H H H H H o o O o H H H H H H H H d d d d d d d a ra d ra ra ra d d d d α d d d d d d d d d d d ra ra d d d d o O O O O O O O O O O O O O o O d d d d O O O M M r o O M ra | o o O ar | 1 1 ra ra ra ra ra M M M ra M M ra ra M ra ra r H d d d d d d d d o ra M a d d d d d d d d M ra ra M d d d d d d d d 1 1 1 1 1 1 1 μ-> 1 μ- 1 μ- > 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ra ra M ra H ra H ra M ra M M > o μ-> o o ra ra M M 1 1 1 1 M μ- 1 μ^ o μ-> μ-> μ ra M M M M M M μ- -> μ-> μ- 1 μ- 1 μ-> o o μ- > o μ- » o o μ-> μ- » 1 1 1 1 1 1 1 1 1 I 1 1 1 1 o μ-> μ-> μ- 1 1 1 1 1 1 1 1 o μ-> μ- > o o o o μ- 1 μ- 1 μ- 1 uι cn c^ o μ t ^ H H P P H lh* P P C!l K OS oo oo ιt* ιt* ιt* o ιt* μ- 1 en en if* en it* ui vo if* Pd ?d ?d pa V V Pd pd pd pd Pd pa Pd ^ ra o μ-» CO < μ-> 3 en to en < σs o • a o < o Gl IN OUT PWL(l) IN OUT -2V,-.8n -IV, - .8n -.75V, -.55n -.5V,-.21n OV, On .5V, .21n .75V, .55n IV, .8n 2V, .8n SMOOTH=l .ENDS .END Nand Netlist Moletronics .OPTIONS RELTOL=.01 ITL4=10 SCALE=1 POST METHOD=Gear DCSTEP=10 .OPTIONS ACCT=0 INGOLD=l NOMOD PROBE .TRAN lOOOOn lOOOOOn ROutl 1 0 1 .PRINT TRAN I(Rou l) Cl 1 0 lOf VInputB2 2 0 P L(0n,0V 20000n,0V 20001n,0.5V 30000n,0.5V 30001n,2V 40000n,2V + 40001n,0.5V 50000n,0.5V 50001n,0.5V 60000n,0.5V + 60001n,0.5V 70000n,0.5V 70001n,2V 80000n,2V + 80001n,0.5V 90000n,0.5V 90001n,0.5V 100000n,0.5V ) .PRINT TRAN 2 C2 2 0 lOf C3 3 0 lOf C4 4 0 lOf C5 5 0 lOf C6 6 0 lOf C7 7 0 lOf C8 8 0 lOf C9 9 0 lOf CIO 10 0 lOf Cll 11 0 lOf C12 12 0 lOf C13 13 0 lOf C14 14 0 lOf VInputA15 15 0 PWL(0n,0V 20000n,0V 20001n,0.5V 30000n,0.5V 30001n,0.5V 40000n,0.5V + 40001n,0.5V 50000n,0.5V 50001n,2V 60000n,2V + 60001n,0.5V 70000n,0.5V 70001n,2V 80000n,2V + 80001n,0.5V 90000n,0.5V 90001n,0.5V 100000n,0.5V ) .PRINT TRAN 15 C15 15 0 lOf C16 16 0 lOf C17 17 0 lOf C18 18 0 lOf C19 19 0 lOf C20 20 0 lOf C24 24 0 5f C27 27 0 5f C29 29 0 5f C32 32 0 5f C34 34 0 5f C35 35 0 5f C37 37 0 5f C39 39 0 5f C42 42 0 5f C44 44 0 5f C47 47 0 5f C49 49 0 5f C50 50 0 5f C52 52 0 5f C53 53 0 5f C54 54 0 5f C55 55 0 5f C56 56 0 5f C57 57 0 5f C58 58 0 5f C59 59 0 5f C60 60 0 5f C61 61 0 5f C62 62 0 5f C63 63 0 5f C64 64 0 5f C67 67 0 5f C68 68 0 5f C69 69 0 5f C70 70 0 5f C71 71 0 5f C72 72 0 5f C74 74 0 5f C75 75 0 5f C76 76 0 5f C77 77 0 5f C78 78 0 5f C79 79 0 5f C82 82 0 5f C83 83 0 5f C84 84 0 5f C85 85 0 5f C86 86 0 5f C87 87 0 5f C88 88 0 5f C89 89 0 5f C90 90 0 5f C92 92 0 5f C93 93 0 5f C94 94 0 5f C97 97 0 5f C99 99 0 5f ClOl 101 0 5f C102 102 0 5f C103 103 0 5f C104 104 0 5f C105 105 0 5f C106 106 0 5f C108 108 0 5f C109 109 0 5f Clll 111 0 5f C112 112 0 5f C113 113 0 5f C114 114 0 5f C115 ' 115 0 5f C116 116 0 5f C119 119 0 5f C120 120 0 5f C121 121 0 5f C122 122 0 5f C123 123 0 5f C124 124 0 5f C125 125 0 5f C128 128 0 5f C129 129 0 5f C130 130 0 5f C131 131 0 5f C132 132 0 5f C133 133 0 5f C134 134 0 5f C135 135 0 5f C136 136 0 5f C137 137 0 5f C138 138 0 5f C139 139 0 5f C142 142 0 5f C143 143 0 5f C144 144 0 5f C145 145 0 5f C146 146 0 5f C147 147 0 5f C149 149 0 5f C150 150 0 5f C151 151 0 5f C152 152 0 5f C153 153 0 5f C154 154 0 5f C157 157 0 5f C158 158 0 5f C159 159 0 5f C160 160 0 5f C161 161 0 5f C162 162 0 5f C163 163 0 5f C164 164 0 5f C165 165 0 5f C166 166 0 5f C167 167 0 5f C168 168 0 5f C169 169 0 5f C172 172 0 5f C173 173 0 5f C175 175 0 5f C176 176 0 5f C178 178 0 5f C179 179 0 5f C180 180 0 5f C181 181 0 5f C182 182 0 5f C183 183 0 5f C184 184 0 5f C186 186 0 5f C187 187 0 5f C188 188 0 5f C190 190 0 5f C191 191 0 5f C192 192 0 5f C193 193 0 5f C194 194 0 5f C195 195 0 5f C196 196 0 5f C197 197 0 5f C198 198 0 5f C199 199 0 5f C200 200 0 5f C202 202 0 5f C203 203 0 5f C204 204 0 5f C205 205 0 5f C206 206 0 5f C207 207 0 5f C208 208 0 5f X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X o n o o rj o o n o n o π n n π ιP^ rf^ iP≥. rf^ ιP» ιP^ § ^ »!--. iP-. tl^> ιP^ ιP-» rt=^ rf^ lp-. »P-> rf^ rt=^ rf≥> rf=^ ιl^ rf^ ι4--. il--. »»--. rf--. if-- ιP-» it-*. *-» tp-. rf-*. if-*. ιJ-=. <_Ti CJ1 l_π (_J1 _π Ul (j " ! t_n l_π tjn tjn t3 ts j) t^> tv j C\J ts-> t-> IS- ts-ϊ ts_> ISJ tvj tv-) to INJ t uι iΛ W w iΛ Ui n cΛ m cn c m cn Λ m ^ *ι *ι ^ * -Jι ωco cωo ∞co CθD3 ∞co cθo3 cθoo (oio) (cBo ivoo ivDo ivDo Uvos avo oo oo oo oo oo oo oo oo Hμ-' μμ j μμ-' ^ιt* ^ιt* uco uco ωco ι u t to t μ μ μ μ μ uι o μ to j ^ cfι *ι co iD o cfι *ι co vo o μ to ω uι c -J θ3 o μ ι ιii io ifl si ιi- Nj μ j VQ ιt* t VO I ιt* t O μ- > tO NJ tO tO INJ to μ μ to t to to μ M to to to to μ- 1 μ μ to to to to cπ INJ μ-> NJ NJ NJ NJ NO tO tO NJ NJ NJ tO tO tO tO tO t vo μ-> ι- > μ-> μ-> O O μ μ σs H to to CO CO co to t o o co σs CO CO OJ OJ CO CO O ω u M to to μ μ μ μ μ to to it* it* it* it* -j ~o vo vo to to it* vo to NJ it* if* -J -J VO N j μ- > VO lt* NJ VD l ιt* NJ O INJ to to to t to to t to to NJ NJ NJ t μ-> to to ui ui μ co to to μ- > μ-> μ- 1 H» μ- 1 μ- 1 to μ-> co CO INJ tO μ-> μ-> to to o t CO μ- 1 CO if* NJ it* O O O O O O O O O O O O O O O to o I μ-> co co σs σs vo σs -J to co -j O it* CO vo vo vo vo it* 00 NJ VO VO to O it* if* vo μ-> to to vo it* £ μ- > cn eπ en cπ cπ eπ cπ cπ cπ ui eπ ui cπ cn eπ £ £ £ £ £ £ α d £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ Hi Hi Hi Hi h Hi Hi Mi Hs Hi Hi Hi Hi Hi Hi £ aa O _ d d d £ d pa d d £ £ £ d d D d a d £ D t π t £ D a pa a d d d D d p paa ppaa p d d d pa pa dd d ?d pd pd pd Pd Pd d pd d pa pa pa d d Pd Pd pa V pa pa dd dd d α d Pd H H d d ppdd ppdd d d d d d d d d Pd d o O ti d d Pd Pd d d d d d d d H H H H H H d o o H H dd dd H H H H H d H H H H H d H o oo o o o d d o o H H _ o d H H H O H O O O O o 0 H O o o o o o H d o d o O o d d d d o ra a ra M d d O OO d d O d d d d O tl tl d d dd H O I d d d d . r ra ra ra d 1 1 ra ra d dd M M ra d ra ra H IS d ra ra ra ra ra ra ra . d I H ra a M I 1 1 1 1 1 ra μ-> o 1 1 H H I I .ra I 1 ra I I I I I ,M I I r 1 l l l l μ- 1 μ-> 1 o o | l o μ-> o o o μ-> I O μ-> O O | O O O | σ μ-> o o o o X453 210 209 NDRDIODE_l X452 209 224 NDRDIODE_0 X451 209 208 NDRDIODE_0 X450 224 208 NDRDIODE_l X449 18 208 NDRDIODE_0 X448 222 208 NDRDIODE_l X447 207 208 NDRDIODE_l X446 222 207 NDRDIODE_l X445 207 206 NDRDIODE_l X444 206 222 NDRDIODE_0 X443 206 17 NDRDIODE_0 X442 206 17 NDRDIODE_0 X441 206 205 NDRDIODE_0 X440 205 17 NDRDIODE_0 X439 204 205 NDRDIODE_l X438 17 204 NDRDIODE_0 X437 204 219 NDRDIODΞ__0 X436 16 204 NDRDIODE_0 X435 203 204 NDRDIODΞ_0 X434 203 16 NDRDIODE_0 X433 203 202 NDRDIODE_l X432 16 202 NDRDIODE_l X431 217 202 NDRDIODE_0 X430 202 10 NDRDIODE_0 X428 10 202 NDRDIODE_l X427 200 5 NDRDIODE_0 X426 199 200 NDRDIODE_l X425 199 5 NDRDIODE_l X424 199 214 NDRDIODE_l X423 199 198 NDRDIODE_0 X422 197 198 NDRDIODE_l X421 212 197 NDRDIODE_0 X420 196 197 NDRDIODE_0 X419 195 196 NDRDIODE_l X418 195 210 NDRDIODE_l X417 195 209 NDRDIODE_l X416 194 195 NDRDIODE_l X415 194 209 NDRDIODE_0 X414 194 193 NDRDIODE_0 X413 193 209 NDRDIODΞ_0 X412 193 208 NDRDIODEJ. X411 207 193 NDRDIODE_0 X410 193 192 NDRDIODE_l X409 207 192 NDRDIODE_0 X408 191 192 NDRDIODE_0 X407 207 191 NDRDIODE_0 X406 191 206 NDRDIODE_l X405 205 191 NDRDIODE_l X404 190 191 NDRDIODE_l X403 205 190 NDRDIODE_l X402 188 203 NDRDIODE_l X401 188 187 NDRDIODE_l X400 187 203 NDRDIODE_l X399 202 187 NDRDIODE_0 X398 10 187 NDRDIODE_0 X397 186 10 NDRDIODE_0 X396 187 186 NDRDIODE_l X395 200 4 NDRDIODΞ_0 X394 4 184 NDRDIODE_l X393 184 200 NDRDIODE_0 X392 184 199 NDRDIODE 1 X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X co co eo co co en cπ en cπ cπ en cπ en σs σs σs σs σs σs σs s crs co co co co co vo o cπ σs vo crs oo vo o to en σs co vo cπ σs o o en σs vo o en σs co vo o μ j μ-> M μ-> μ-> μ- > vo cπ σs σs σs σs σs σs σs σs σs co σs σs crs σs σs co crs co σs s vo o vo vo vo vo oo vo vo vo vo o en vo o en cπ vo s o cπ o oo vo vo en σs σs vo M μ- 1 H 1 H en -J en σs crs σs σs σs crs crs σs crs σs crs σs crs σs crs σs s σs vo vo vo vo en vo o o cπ σs co co en o cπ en σs σs co oo vo vo vo £ £ £ £ σs en σs σs σs σs o o o o μ-> M σs co d d d d £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ Pd Pd Pd pa £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ g d d d d d d d d § g £ d d d d d d d d d d d d d d d d d d d d d d d d d d D d d d d d d d d d d d d d d D d d d d d d d d D d Pd d ?d Pd pa pa pa ?d pd Pd Pd Pd Pd ?d pa V pa pa pa V pa pa pa V pa pa Pd Pd H H H Pd pa pa pa pa pa d Pd ?d Pd pa pa a pa V pa pa V pa pa pa pa V Pd pa pa Pd Pd d d d d d d d d d d d d d d d α d d d a d d d d d d d d O O O O d d d d d d d α d d d d d d d d d d d d d d d d α d d d H H H H H H H d d d d H H H H H H H H H H H o o O O o o o o O o O O O O o o O O O O o o o o o O O o M M M M O o o o o o O o o o o o O o o O o o o o o o O o o o o O d d d d d d α d d d d α d d d d d d d d d d d d d d d d 1 1 1 1 d d d d α d d d d d d d d d d d d d d d d d d d d α d d M ra ra ra ra ra ra ra M ra ra ra ra M ra M M ra H ra ra w ra ra ra ra M ra o o o ra ra ra ra M M ra M ra M ra ra M ra ra ra ra M ra ra ra ra M ra ra ra M H l l l l l l l l l μ-> o o o o o μ j o o μ-' μ Λ o o o μ-' o o o o μ-> μ-> μ- ι μ- , μ- l μ- ι μ-' μ-> o o μ-> μ- 1 o o μ-> o o μ- 1 μ-> μ-> o o o μ- > o μ-> o o o o μ- , IsJ © © N NJJ tNOJ NNJJ NNJJ tNOJ tMO tMO tIOO tNOJ NMJ NNJJ tNOJ tMO NNJJ INOJ NNJJ NNJJ ttOO tNOJ tNOJ NNJJ tNOJ INOJ tNOJ MtO NNJJ tNOJ tNOJ tNOJ INNJJ NNJJ NNJJ INOJ OOJJ OOJJ OOJJ OOJJ CCOO ωCO CO CO OJ CO CO CO ω σ (Λs o rris m σois o σis s --i -oi Nii -^ s -oi --Oj soi si si J ffl cffio i cioi oiioi c coo ∞ oo roco ffi no vioo u voi i vDn i vDo i vDo i ion i mo iiDn i ion i ion o t— ι oo ro-s o r- 1 πo oo ros o r~> co-s o r-s μμ-> μμ-* μ μ-ι H i— * i μ--'ι μ μ-> μ i—t μ i—t iμ— i μ i—i t NoJ twNoJ iNJ wNJ i ttoO tMNoJ t tNJ rNoJ uι Λ i co iD o μ to ) ιN uι σi si (» o o μ to ^ m ι ∞ o o μ w u ιt> ^ σs i ra o o μ t u ι^ uι σι si (iι ω o μ to u ^ uι σι si cι o NJ ιf* en σs ~J Co vo μ- 1 ui co en vo l o IsJ © X264 134 133 NDRDIODE_0 X263 133 149 NDRDIODE_0 X262 133 147 NDRDIODE_0 X261 132 133 NDRDIODE_l X260 147 132 NDRDIODE_l X259 131 132 NDRDIODE_l X258 147 131 NDRDIODE_0 X257 146 131 NDRDIODE_l X256 131 145 NDRDIODE_0 X255 131 130 NDRDIODE_0 X254 145 130 NDRDIODE_0 X253 130 129 NDRDIODE_l X252 129 145 NDRDIODE_0 X251 129 144 NDRDIODE_l X250 143 129 NDRDIODE_0 X249 128 129 NDRDIODE_l X248 143 128 NDRDIODE_l X246 3 125 NDRDIODE_l X245 124 125 NDRDIODE_l X244 3 124 NDRDIODE_l X243 124 139 NDRDIODE_l X242 138 124 NDRDIODE_0 X241 124 123 NDRDIODE_0 X240 138 123 NDRDIODE_0 X239 122 123 NDRDIODE_l X238 122 138 NDRDIODE_l X237 122 137 NDRDIODE_0 X236 136 122 NDRDIODE_l X235 121 122 NDRDI0DE_1 X234 121 136 NDRDIODE_l X233 121 120 NDRDIODE_0 X232 136 120 NDRDIODE_l X231 120 135 NDRDIODE_l X230 120 134 NDRDIODE_0 X229 120 119 NDRDIODE_0 X228 134 119 NDRDIODE_0 X227 115 116 NDRDIODE_l X226 115 130 NDRDIODE_0 X225 114 115 NDRDIODE_0 X224 114 130 NDRDIODE_0 X223 129 114 NDRDIODE_0 X222 114 128 NDRDIODE_l X221 113 114 NDRDIODE_l X220 113 128 NDRDIODE_0 X219 112 113 NDRDIODE_0 X218 112 128 NDRDIODE_0 X217 112 8 NDRDIODE_l X216 111 8 NDRDIODE_l X215 112 111 NDRDIODE_0 X214 2 125 NDRDIODE_l X213 2 109 NDRDIODE_0 X212 125 109 NDRDIODE_l X211 109 124 NDRDIODE_0 X210 109 123 NDRDIODE_l X209 108 109 NDRDIODE_l X208 123 108 NDRDIODE_0 X207 121 106 NDRDIODE_0 X206 106 105 NDRDIODE_l X205 121 105 NDRDIODE_l X204 120 105 NDRDIODE_0 X203 119 105 NDRDIODE_0 X202 105 104 NDRDIODE_0 X201 119 104 NDRDIODE_0 X200 104 103 NDRDIODE_l X199 103 119 NDRDIODE_l X198 102 103 NDRDIODE_l X197 101 102 NDRDIODE_0 X196 101 116 NDRDIODE_l X195 115 101 NDRDIODE_0 X194 99 115 NDRDIODE_l X193 114 99 NDRDIODE_l X192 113 99 NDRDIODE_0 X191 97 113 NDRDIODE_l X190 112 97 NDRDIODE_l X189 111 97 NDRDIODE_0 X188 111 7 NDRDIODE_l X187 97 7 NDRDIODE_l X185 2 94 NDRDIODE_l X184 2 94 NDRDIODE_0 X183 94 109 NDRDIODΞ_l X182 94 108 NDRDIODE_l X181 93 94 NDRDIODE_0 X180 93 108 NDRDIODE_l X179 93 92 NDRDIODE_0 X178 108 92 NDRDIODE_l X177 106 92 NDRDIODE_0 X176 106 90 NDRDIODE_0 X175 105 90 NDRDI0DE_1 X174 90 104 NDRDIODE_0 X173 89 90 NDRDIODE_0 X172 104 89 NDRDIODE_0 X171 89 88 NDRDIODE_0 X170 88 104 NDRDIODE_0 X169 103 88 NDRDIODE_0 X168 88 102 NDRDIODE_0 X167 87 88 NDRDIODE_0 X166 87 102 NDRDIODE_0 X165 86 87 NDRDIODE_0 X164 86 102 NDRDIODE_0 X163 101 86 NDRDIODE_l X162 86 85 NDRDIODE_0 X161 84 85 NDRDIODE_l X160 84 99 NDRDIODE_0 X159 84 83 NDRDIODE_l X158 83 82 NDRDIODE_l X157 82 97 NDRDIODE_l X156 82 7 NDRDIODE_0 X154 7 82 NDRDIODE_0 X152 1 79 NDRDIODE_l X151 2 79 NDRDIODE_l X150 94 79 NDRDI0DE_1 X149 93 79 NDRDIODE_0 X148 78 79 NDRDIODΞ_0 X147 78 93 NDRDIODΞ_l X146 78 77 NDRDIODΞ_0 X145 77 93 NDRDIODE_0 X144 92 77 NDRDIODE_l X143 77 76 NDRDIODE_0 X142 76 75 NDRDIODE_0 X141 90 75 NDRDIODE_0 X140 75 89 NDRDIODE_0 X139 74 75 NDRDIODE_0 X138 74 89 NDRDIODE_0 X137 87 72 NDRDIODE_l XI36 72 71 NDRDIODE_l XI35 87 71 NDRDIODE_0 X134 71 86 NDRDIODE_l X133 71 85 NDRDIODE_0 XI32 70 71 NDRDIODE_0 X131 85 70 NDRDIODE_l X130 70 69 NDRDIODE_l X129 85 69 NDRDIODE_0 XI28 69 84 NDRDIODE_0 X127 69 83 NDRDIODE_l X126 68 69 NDRDIODE_0 X125 83 68 NDRDIODE_l X124 68 67 NDRDIODE_0 X123 83 67 NDRDIODE_0 X122 67 82 NDRDIODE_0 X121 7 67 NDRDIODE_0 X119 6 67 NDRDIODE_l X117 64 1 NDRDIODE_l XI16 64 1 NDRDIODE_l X115 79 64 NDRDIODE_l X114 64 78 NDRDIODE_l X113 63 64 NDRDIODE_l X112 78 63 NDRDIODE_0 Xlll 63 62 NDRDIODE_0 X110 78 62 NDRDIODE_l X109 62 77 NDRDIODE_l X108 62 76 NDRDIODE_0 XI07 62 61 NDRDIODE_0 XI06 76 61 NDRDIODE_l X105 60 61 NDRDIODE_0 XI04 76 60 NDRDIODE_l XI03 60 75 NDRDIODE_0 XI02 74 60 NDRDIODE_0 X101 59 60 NDRDIODE_0 X100 59 74 NDRDIODE_0 X99 59 58 NDRDIODE_0 X98 58 74 NDRDIODE_l X97 72 58 NDRDIODE_l X96 57 58 NDRDIODE_l X95 72 57 NDRDIODE_l X94 56 57 NDRDIODE_0 X93 72 56 NDRDIODE_l X92 56 71 NDRDIODE_0 X91 56 70 NDRDIODE_l X90 56 55 NDRDIODE_l X89 55 70 NDRDIODΞ_l X88 54 55 NDRDIODE_l X87 70 54 NDRDIODE_0 X86 69 54 NDRDIODE_0 X85 54 68 NDRDIODΞ_l X84 54 53 NDRDIODE_0 X83 68 53 NDRDIODE_l X82 52 53 NDRDIODE_l X81 68 52 NDRDIODΞ_0 X80 67 52 NDRDIODE_l X79 52 6 NDRDIODE_l X77 6 52 NDRDIODE_0 X76 1 50 NDRDIODE l X75 50 49 NDRDIODE_l .SUBCKT NDRDI0DE_1 IN OUT Gl IN OUT P L(l) IN OUT -IV, -In -.8V,-ln ~.625V,-760n OV, On .625V,760n .8V, In IV, In SMOOTH=l .ENDS .SUBCKT NDRDIODE_0 IN OUT Gl IN OUT P L(l) IN OUT -2V,-.8n -IV, - .8n -.75V,-.55n -.5V,-.21n OV, On .5V, .21n .75V, .55n IV, .8n 2V, .8n SMOOTH=l .ENDS .END Inverse Half Adder Netlist Moletronics .OPTIONS RELTOL=.01 ITL4=10 SCALE=1 POST METHOD=Gear DCSTΞP=10 .OPTIONS ACCT=0 INGOLD=l NOMOD PROBE .TRAN lOOOOn lOOOOOn ROutl 1 0 1 .PRINT TRAN I (Routl) Cl 1 0 lOf VInputB2 2 0 PWL(0n,0V 20000n,0V 20001n,0.5V 30000n,0.5V 30001n,2V 40000n,2V + 40001n,0.5V 50000n,0.5V 50001n,0.5V 60000n,0.5V + 60001n,0.5V 70000n,0.5V 70001n,2V 80000n,2V + 80001n,0.5V 90000n,0.5V 90001n,0.5V 100000n,0.5V ) .PRINT TRAN 2 C2 2 0 lOf C3 3 0 lOf C4 4 0 lOf C5 5 0 lOf VInputB6 6 0 P L(0n,0V 20000n,0V 20001n,0.5V 30000n,0.5V 30001n,2V 40000n,2V + 40001n,0.5V 50000n,0.5V 50001n,0.5V 60000n,0.5V + 60001n,0.5V 70000n,0.5V 70001n,2V 80000n,2V + 80001n,0.5V 90000n,0.5V 90001n,0.5V 100000n,0.5V ) .PRINT TRAN 6 C6 6 0 lOf C7 7 0 lOf ROut2 8 0 1 .PRINT TRAN I(Rout2) C8 8 0 lOf C9 9 0 lOf VInputAlO 10 0 PWL(0n,0V 20000n,0V 20001n,0.5V 30000n,0.5V 30001n,0.5V 40000n,0.5V + 40001n,0.5V 50000n,0.5V 50001n,2V 60000n,2V + 60001n,0.5V 70000n,0.5V 70001n,2V 80000n,2V + 80001n,0.5V 90000n,0.5V 90001n,0.5V 100000n,0.5V ) .PRINT TRAN 10 CIO 10 0 lOf VDInputAll 11 0 PWL(0n,0V 20000n,0V 20001n,2V 30000n,2V 30001n,2V 40000n,2V 40001n,2V 50000n,2V 50001n,0.5V 60000n,0.5V 60001n,2V 70000n,2V 70001n,0.5V 80000n,0.5V 80001n,2V 90000n,2V 90001n,2V 100000n,2V ) .PRINT TRAN 11 Cll 11 0 lOf C12 12 0 lOf C13 13 0 lOf C14 14 0 lOf VInputA15 15 0 P L(0n,0V 20000n,0V 20001n,0.5V 30000n,0.5V 30001n,0.5V 40000n,0.5V + 40001n,0.5V 50000n,0.5V 50001n,2V 60000n,2V + 60001n,0.5V 70000n,0.5V 70001n,2V 80000n,2V + 80001n,0.5V 90000n,0.5V 90001n,0.5V 100000n,0.5V ) .PRINT TRAN 15 C15 15 0 lOf VDInputBl6 16 0 P L(0n,0V 20000n,0V 20001n,2V 30000n,2V 30001n,0.5V 40000n,0.5V 40001n,2V 50000n,2V 50001n,2V 60000n,2V 60001n,2V 70000n,2V 70001n,0.5V 80000n,0.5V 80001n,2V 90000n,2V 90001n,2V 100000n,2V ) .PRINT TRAN 16 C16 16 0 lOf o o o o o ui cπ en cπ ui cπ cn cπ ui ui cπ cn cπ cπ cπ cπ cπ en cn cπ cn cn cπ cπ cπ cn ui cπ cn ui cπ cπ cπ cπ cn iji ui ui u^ μ- 1 μ- 1 Mi Ml ht Hi Hl Mi Hi Hi Mi Hi Hi lli Hi Hi Hi Hi Hi Hi H Ml l-ll Ml Hi Hi ht Hi μή Hi h μi Hi ht Hl Hi rt hli Hi H Hi Hi rt o o eenn eenn eenn eenn eenn t ~ πh ri Hi i~h μts μts H ts IsJ © 90 C106 106 0 5f C108 108 0 5f C109 109 0 5f Clll 111 0 5f C112 112 0 5f C113 113 0 5f C114 114 0 5f C115 115 0 5f C116 116 0 5f C119 119 0 5f C120 120 0 5f C121 121 0 5f C122 122 0 5f C123 123 0 5f C124 124 0 5f C125 125 0 5f C128 128 0 5f C129 129 0 5f C130 130 0 5f C131 131 0 5f C132 132 0 5f C133 133 0 5f C134 134 0 5f C135 135 0 5f C136 136 0 5f C137 137 0 5f C138 138 0 5f C139 139 0 5f C142 142 0 5f C143 143 0 5f C144 144 0 5f C145 145 0 5f C146 146 0 5f C147 147 0 5f C149 149 0 5f C150 150 0 5f C151 151 0 5f C152 152 0 5f C153 153 0 5f C154 154 0 5f C157 157 0 5f C158 158 0 5f C159 159 0 5f C160 160 0 5f C161 161 0 5f C162 162 0 5f C163 163 0 5f C164 164 0 5f C165 165 0 5f C166 166 0 5f C167 167 0 5f C168 168 0 5f C169 169 0 5f C172 172 0 5f C173 173 0 5f C175 175 0 5f C176 176 0 5f C178 178 0 5f C179 179 0 5f C180 180 0 5f C181 181 0 5f C182 182 0 5f C183 183 0 5f C184 184 0 5f C186 186 0 5f C187 187 0 5f C188 188 0 5f C190 190 0 5f C191 191 0 5f C192 192 0 5f C193 193 0 5f C194 194 0 5f C195 195 0 5f C196 196 0 5f C197 197 0 5f C198 198 0 5f C199 199 0 5f C200 200 0 5f C202 202 0 5f C203 203 0 5f C204 204 0 5f C205 205 0 5f C206 206 0 5f C207 207 0 5f C208 208 0 5f C209 209 0 5f C210 210 0 5f C212 212 0 5f C214 214 0 5f C217 217 0 5f C219 219 0 5f C222 222 0 5f C224 224 0 5f C229 229 0 5f C231 231 0 5f C232 232 0 5f C234 234 0 5f C237 237 0 5f C239 239 0 5f C242 242 0 5f C244 244 0 5f X512 20 244 NDRDIODE_0 X511 242 20 NDRDIODE_0 X510 19 242 NDRDIODE_l X508 239 19 NDRDIODE_0 X507 18 239 NDRDIODE_0 X506 237 18 NDRDIODE_0 X505 237 17 NDRDIODE_l X503 234 17 NDRDIODE_0 X502 234 16 NDRDIODE_0 X501 16 232 NDRDIODE_l X500 232 231 NDRDIODE_l X499 5 229 NDRDIODE_0 X498 229 244 NDRDIODE_0 X497 20 229 NDRDIODE_0 X496 20 229 NDRDIODΞ_0 X490 239 19 NDRDIODE_0 X489 224 19 NDRDIODE_l X488 224 239 NDRDIODE_0 X487 18 224 NDRDIODE_0 X486 18 239 NDRDIODE_0 X484 18 237 NDRDIODE_l X483 222 18 NDRDIODE_l X482 237 222 NDRDIODE_0 X481 222 17 NDRDIODE_0 X480 237 17 NDRDIODE_0 X475 219 17 NDRDIODE_0 X 74 219 17 NDRDIODE_l X473 219 234 NDRDIODE_0 X472 219 16 NDRDIODE_0 X471 16 219 NDRDIODE_l X469 217 16 NDRDIODE_0 X468 217 16 NDRDIODE_0 X467 217 232 NDRDIODE_0 X466 217 231 NDRDIODE_0 X465 10 231 NDRDIODE_0 X464 10 217 NDRDIODE_0 X462 214 5 NDRDIODE_l X461 214 5 NDRDIODE_0 X460 214 229 NDRDIODE_0 X459 214 20 NDRDIODE_0 X458 212 20 NDRDIODE_0 X457 212 19 NDRDIODE_l X456 210 19 NDRDIODE_l X455 19 210 NDRDIODE_l X454 210 224 NDRDIODE_l X453 210 209 NDRDIODΞ_l X452 209 224 NDRDIODE_l X451 209 208 NDRDIODE_l X450 224 208 NDRDIODE_l X449 18 208 NDRDIODE_0 X448 222 208 NDRDIODE_0 X447 207 208 NDRDIODE_0 X446 222 207 NDRDIODE_0 X445 207 206 NDRDIODE_0 X444 206 222 NDRDIODE_0 X443 206 17 NDRDIODE_l X442 206 17 NDRDIODE_l X441 206 205 NDRDIODE_l X440 205 17 NDRDIODΞ_0 X439 204 205 NDRDIODE_l X438 17 204 NDRDIODE_l X437 204 219 NDRDIODE_l X436 16 204 NDRDIODE_0 X435 203 204 NDRDIODE_0 X434 203 16 NDRDIODE_l X433 203 202 NDRDIODE_l X432 16 202 NDRDIODE_l X431 217 202 NDRDIODE_l X430 202 10 NDRDIODE_l X428 10 202 NDRDIODE_l X427 200 5 NDRDIODE_l X426 199 200 NDRDIODE_0 X425 199 5 NDRDIODE_l X424 199 214 NDRDIODE_0 X423 199 198 NDRDIODE_l X422 197 198 NDRDIODE_l X421 212 197 NDRDIODE_l X420 196 197 NDRDIODE_0 X419 195 196 NDRDIODE_0 X418 195 210 NDRDIODE_0 X417 195 209 NDRDIODE_0 X416 194 195 NDRDIODE_0 u w ω w ω Lo ω ω u ω w u u w ω w ω L v^ μ- 1 (-> H 1 μ-> μ-> μ> vo μ-> μ-> μ-> μ- ι μ-> μ- ι μ-> μ-> μ-> μ- » μ-> μ- 1 μ- 1 μ- > μ-> μ μ μ to μ to μ to μ to μ ω μ μ μ s oo co σs σs co -o -J o vo 00 vo vo co o co co if* vo o μ- 1 σs NJ NJ o it* σs o -o -J θθ θo cπ o cπ μ j -o μ- > -o co -J co oo ιf* ι co μ-> μ- > μ- > μ- > NJ VO μ-> μ-> μ j μ j -> μ-> μ j μ- > j μ j μ- 1 μ- > μ- 1 μ- > μ- > μ-> > μ- > μ^ μ- > to μ to μ μ μ to μ μ μ μ μ to to μ t σs σs σs co co -J ^J -J -J -J -J -J -J -J vo vo co 00 00 CO vo co vo o vo vo o NJ NJ Co cπ σs σs σs σs oo it* o o o o o μ- > σs o £ £ d d t-l d £ ^ £ ?d ?d pa pa £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ pa pa d £ £ £ £ £ £ £ £ £ ££ ££ £ £ £ £ d d d o π d d d d d tl tl d dd dd ϋd d d d O π d pa pd d d d d d tl dd d dd dd d d ϋ d pa Pd pd pd H H H pa pa pd pd pd pd pd pa pa pa pd 5d Pd Pd Ppda ppaa p pia pa pa pa pa pa pa pa d pd Pd pd pa H H d d Pd pd d pd Pd pd pd pa pa pa pd pd pa pd d d d d O O d d d d d d d d d d d d H O o d d d d d d d d d d d C) o H H d d d d l d d d d d d α d d H tl d H H H H H H H H H H H H H H H H tl d H 0 o H H H H H H H H H H H fi O M M ra ra o Cl O OO OO O o o O o O O o r> o o o o o o o r> o O O O m M O d d o o O O O n oo o o o o o o o o d d . . I I I I π ti d d d d d d d d tl tl tl d d d d d d d d d d d d d 1 d M ra d d d d d d d d d d d d ra M ra ra o μ-> o o ra ra M ra ra H M ra ra ra M ra ra ra ra M ra ra ra ra M M M ra ra M ra H > μ- > M 1 I ra ra M ra ra M H M H H ra ra ra ra M l l l l I I I I I ■ ■ I I I I I I I I o| 1 I I I ' I I I I I I I I I " o o μ-> o o o o o Iμ- , Io Io Iμ j Iμ j Io Iμ-' Io Iμ j oo o μ- 1 σ o μ- 1 o o μ- 1 μ-> o μ-> o μ-> o o o o o o o o I I I — tO NJ NJ NJ NJ NJ NJ NJ NJ OJ CO CO OJ OJ CO CO CO CO CO CO CO CO CO CO CO OJ OJ OJ OJ CO CO OJ OJ CO CO CO CO CO CO CO CO Co e^ ω iD io i£i ιo iD iD io ιo o o o o o o o o o o μ μ μ μ μ μ μ μ μ to ω t to ιo to to t u ) u ω u u u u ) U (i ^ ^ ^ ^ ^ ^ |i t. jι uι uι uι μ-> NJ θJ ιt* cn σs si co vo o μ- 1 NJ θθ ιt* cπ σs si ∞ vo o μ- 1 NJ Cθ |t_ en σs si ∞ vo o tθ ιf* cπ c s] ∞ μ> μ-> M μ^ μ^ μ-> μ-' μ-' μ- > μ- ι μ-' μ- ι μ-' μ- s μ-' μ- ι μ- ι μ j μ- ι μ- ι μ j μ- ι μ-' μ-' μ-> μ-> μ-> μ-> μ j co μ- 1 μ-> μ-> μ- 1 μ- 1 μ- 1 μ> μ^ μ j μ-' μ-> μ-> μ-> μ-' μ j μ-> μ-> μ-' μ-> μ-> μ-> μ-> μ j μ-' μ-> μ- > μ j μ it* it* it* σs it* ιt* ιt* ιt* ιt* σs ιf* ιt* ιt* eπ σs σs σs en eπ eπ cπ en cπ eπ σs en σs en en en en ui en en ui ui s-Ji e Unl OS s siI OOSS O OSS OOSS C OTSi OOSS s -OI ]] σ usi - sJi σ Usl - soi (σJs l c UoJ Uσsl o wo σ Usl c wo σ usi υσsi u co it* if* o if* ui ui oi os to si si io o ifs ui os o μ to io i to io oo eo co it* -j -o -J ~o co oo oo co vo o uι μ-' μ-> μ-> NJ NJ oo vo ιt* vo uι vD eπ μ j eπ μ-' si μ-' si si en μ- » μ-> μ-> μ-> μ-> μ-> μ- 1 μ- > μ- 1 μ ,- 1 , , ' μ- j μ-> μ- > μ j μ j μ- > μ Λ μ j μ- > μ-> μ-> μ-> μ-> μ-> μ-> μ μ μ μ μ μ-> μ j μ j μ-> μ-> μ-> μ-> μ-> μ-> μ-> μ-> μ- l μ j μ-> μ-> μ-> μ-> μ-> μ-> μ-> μ-> μ-> μ it* en en it* it* σs it* σs ιt* ιf* σs σs ιt* eπ eπ uι uι σs uι σs σs σs eπ en ui ui os si si cπ si cπ ui sl ui CΛ m -j i αs os oi uS os os oi fJs co oi os αs cfi Co co σ it* oo vo it* en o σs σs NJ ιt* vo o o o μ- ι σs μ j σs ι oo eo eo it * it * vo to co -j oo vo vo en vo o o ui crs Co oJ OJ OJ it* it* en o en cTs os crs si NJ OJ c £ £ £ £ £ £ £ £ £ £ £ £ £ Pi Pd Pd pi £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ d d d _ d d d d d d d d d d . d d d d d d d d . d d d d d d d d d d d d _ d _ d d _ _ pd pd pd pd pd pd pd pd pd pd i Pi pa ?d pd pd pd pd pd pd pd pd pd pa pa pd H H pd pd pd pd pd ?d Pd pa d Pd P pd pd pd pd pi pi pi pa pa pa pd pd p d d d d d d d d d d a d d d d d d d d d d d d d d d O d d d d d d d d d d d d d d d d d d d d d d d d H H H H H H H H H H H H H H H H H H d od H H H H H H H αd Pd Pd H H H H H H H H H H H H O O o O O O O O Q O o o o o o o o M ra M M o o o O O O O O O O O O o d d d d d od od d d d d d d d I d d do od od o O dd d od od od d d ' ■ d " " d α d d M M M M M M M ra ra ra ra M ra M ra ra ra M ra ra ra ra M ra ra O O o M M H H M M H M M ra M ra M ra M ra ra M ra .ra .ra ra M ra ra ra I I 1 I 1 I I I I I I I I I I I I 1 I I I I I I I I I I I I I 1 1 I I I I I I I 1 o o o o o μ o o o μ- 1 o " I I o μ^ μ- 1 o μ-> o o o o μ-> μ-» μ-> μ-> o o ' ' l l μ- > μ- > o μ j μ- > o o o μ-> o o o o μ-> σ ol o μ->l μ IsJ X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X to to cπ en ui cπ en en σs σs σs σs σs σs σs σs σs -J co co μ-> cπ σs co o μ-> en σs σ μ- 1 en σs co vo o μ- 1 en σs co vo μ- > σs H to σs vo μ- 1 μ- > μ-> μ- 1 μ-> - 1 μ- 1 μ-> μ- > μ- 1 μ- 1 μ- 1 co vo μ- 1 μ- 1 μ-> cπ en en en σs σs σs μ-> oo vo vo o co μ-> μ- 1 μ-» μ- 1 μ- 1 μ- 1 μ- 1 μ- 1 H μ- 1 co μ- 1 μ- 1 μ-> en en cπ cπ en μ- 1 £ £ pa pa d Pd Pd ?d ?d Pd Pd Pd H H H H ?a pa pa pa H H O o O ar o X226 115 130 NDRDIODE_l X225 114 115 NDRDIODE_l X 24 114 130 NDRDIODE_0 X223 129 114 NDRDIODE_0 X222 114 128 NDRDIODE_l X221 113 114 NDRDIODE_l X220 113 128 NDRDIODE_l X219 112 113 NDRDIODE_0 X218 112 128 NDRDIODE_l X217 112 8 NDRDIODE_l X216 111 8 NDRDIODE_l X215 112 111 NDRDIODE_0 X214 2 125 NDRDIODE_0 X213 2 109 NDRDIODE_l X212 125 109 NDRDIODE_l ' X211 109 124 NDRDIODE_l X210 109 123 NDRDIODE_l X209 108 109 NDRDIODE_0 X208 123 108 NDRDIODE_l X207 121 106 NDRDIODE_l X206 106 105 NDRDIODE_l X205 121 105 NDRDIODE_0 X204 120 105 NDRDIODE_0 X203 119 105 NDRDIODE_l X202 105 104 NDRDIODE_l X201 119 104 NDRDIODE_l X200 104 103 NDRDIODE_0 X199 103 119 NDRDIODE_l X198 102 103 NDRDIODE_0 X197 101 102 NDRDIODE_0 X196 101 116 NDRDIODE_0 X195 115 101 NDRDIODE_l X194 99 115 NDRDIODE_0 X193 114 99 NDRDIODE_0 XI92 113 99 NDRDIODE_l X191 97 113 NDRDIODE_0 X190 112 97 NDRDIODE_l XI89 111 97 NDRDIODE_0 XI88 111 7 NDRDIODE_0 XI87 97 7 NDRDIODE_0 XI85 2 94 NDRDIODE_l XI84 2 94 NDRDIODE_0 X183 94 109 NDRDIODE_l X182 94 108 NDRDIODE_l XI81 93 94 NDRDIODE_l X180 93 108 NDRDIODE_l X179 93 92 NDRDIODE_l X178 108 92 NDRDIODE_0 X177 106 92 NDRDIODE_l X176 106 90 NDRDIODE_l X175 105 90 NDRDIODE_0 X174 90 104 NDRDIODE_0 X173 89 90 NDRDIODE_l X172 104 89 NDRDIODΞ_0 XI71 89 88 NDRDIODE_0 XI70 88 104 NDRDIODE_0 XI69 103 88 NDRDIODE_0 XI68 88 102 NDRDIODE_0 XI67 87 88 NDRDIODE_l XI66 87 102 NDRDIODE_l XI65 86 87 NDRDIODE 0 μ- > μ j μ j μ-' μ Λ i j μ j μ- l μ- ι μ j μ- ι μ- > μ-' μ j μ j μ- ι μ j -> μ j μ- ι μ- » μ- > μ-> μ-> μ- ι μ- > μ- ι μ-' μ- ι μ- , μ- > μ- > μ- > μ-' μ- , μ- > μ- > n o o o o o o o o o o μ μ μ μ μ μ μ μ M t M w ω t M M t ω ω ω ω ω u u u uJ ω ^ ^ ^ ^ ^ iti ^ ^ ^ ^ ui ui ui ui ui ln ui ui os oi cii σ cr o μ-' NJ Co ιf* eπ σs si co vo o μ- 1 NJ θJ ιt* cπ σs si vo μ-' NJ θJ ιt* eπ σs si ∞ vo o μ-' NJ Cθ ιt* cπ σs si cxι vo o en ui si σs si σs si σs σs σs si σs si σs σs si σs σs σs σs co σs oo σs σs σs co si co si si si si s] o vo NJ μ-> oo μ- » c vo vo it* o σs o σs NJ NJ NJ oo co co CO it * vo it* si θJ co co co vo vo cπ o uι o μ-> μ-> sl NJ -0. ιt* ιt* cπ o crs s] NJ si 00 OJ it* o a σs si μ-> si σs σs σs σs σs μ-> co σs σs σs σs σs σs co si -J vo si vo o co vo co CO cπ o σs it* NJ si -j oo vo vo vo cπ crs vo ui σs CO vo vo vo eo vo cπ cπ CO £ £ σs N £ £ £ £ £ £ £ £ £ d £ £ £ £ £ £ £ £ £ £ £ £ £ £ d d £ £ d d d d d d . g £ £ d d d d d Pd Pd d d tl d d d d d d d d dd d d pd Pd d d pd pd i pi pi pa pa pa Pd d Pd Pd Pd Pd Pd d d d pd d Pd pa pa pa pa pa pa pa pa Pd Pd Pd pd pd pd pd pd pd pd pd Pd Pd Pd pd Pd Pd d d Pd Pd pd pd pa pa d d d d d d d d d d d d d d d H d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d pa p H H H H H H o o 0 H H H H H H H H H d 0 C O O O o o O o o o d d O o o o o 0 o o O o o Cl 0 O o o o o d C d d d d d d d d d M M M ra d d ti d d d d d d d d d d d d d ra t? ra ra ra ra ra ra ra ra ra ra ra d d M ra ra d d M H I 1 .ra M ra ra H ra ra H ra ra ra ra ra .ra ra ra ra M ra ra ra H M M M ra ra ra l I I I M ra ra ra ra ra 1 I l l l l l I σ I I I I I l l i i 1 I I I I I I I 1 I 1 I I I o μ μ p l l l l l M O O o μ-» μ-> o o o o o o o o l l l l I o o o o μ- 1 μ- 1 μ- 1 μ- 1 μ- o o μ-> μ- 1 o o o μ-' o μ-' σ o μ-' (- » μ-> μ-> μ-> o o o μ σs co en en (-> en en σs σs s σs σs cπ σs σs σs cπ σs cπ cπ σs en cπ en en vo en o en en cπ o vo o σs σs vo en en en en co en cπ en cπ cπ en en σs σs σs o σs en en cπ en σs en en en en en cπ en o vo σs co o vo vo (-> vo vo vo vo o o σs co £ £ £ £ d £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ d £ d d d £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ £ g pa d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d pa d pa pa Pi d d d D d d d d d d d d d d d d d d d d pa Pd Pd pa pa Pd Pd ?d pd Pd ?d d pa pa pa pa pa pa pa pa pa Pd pa pa Pd Pd d Pd Pd Pd Pd Pd Pd pa d pa d d d pa pa Pi pa pa pa pa pa i pa pa Pd Pd ?d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d H d H d a d d d d d d d d d d d d d d d d d d o H H H H H H H H H H o o o o H H H d o o o O o O o O o o O O O o o o o O O o O O O o o o o o o o O O o o o d o d d α o O o O o o o o O o O o O o o O O o O o M d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d d ra d ra ra M d d d d d d d d d d d d d d d d d d d d 1 M M M M M ar ra ra M ra ra M ra ra ra ra ra ra ra H ra ra ra ra M M M M M M ra ra ra ra ra | M ar ra ra r ra M ra ra ra ra ra ra M ar ra M M ra M o ! 1 1 1 1 o o o o o o o o o o o o o o o o 1 - 1 1 a o o o o o o o o Is! i X35 35 50 NDRDIODE_0 X34 35 34 NDRDIODE_0 X33 50 34 NDRDIODΞ_l X32 34 49 NDRDIODE_l X31 15 34 NDRDIODE_l X30 32 15 NDRDIODE_l X29 32 47 NDRDIODE_0 X28 32 14 NDRDIODE_0 X27 32 14 NDRDIODE_l X22 44 14 NDRDIODE_l X21 14 29 NDRDIODE_0 X20 29 44 NDRDIODE_0 XI9 13 29 NDRDIODE_0 X18 44 13 NDRDIODE_0 X16 13 42 NDRDIODE_0 XI5 13 27 NDRDIODE_l X14 42 27 NDRDIODE_0 X13 27 12 NDRDIODE_0 XI2 12 42 NDRDIODE_0 X7 12 24 NDRDIODE_0 X6 12 24 NDRDIODE_0 X5 39 24 NDRDIODE_l X4 11 24 NDRDIODE_l X3 11 24 NDRDIODE_l .SUBCKT NDRDIODΞ_l IN OUT Gl IN OUT PWL(l) IN OUT -IV, -In - .8V, -In -.625V,-760n OV, On .625V,760n .8V, In IV, In SMOOTH=l .ENDS .SUBCKT NDRDIODE_0 IN OUT Gl IN OUT PWL(l) IN OUT -2V,-.8n -IV, - .8n -.75V, -.55n -.5V,-.21n OV, On .5V, .21n .75V, .55n IV, .8n 2V, .8n SMOOTH=l .ENDS .END

Claims: CLAIMS We claim: 1. A programmable molecular device, comprising: at least one input lead; at least one output lead; and a nano-network spanning said input lead and said output lead, wherein said nano-network comprises a plurality of molecular circuit components. 2. The programmable molecular device according to claim 1 wherein said nano-network is self-assembled. 3. The programmable molecular device according to claim 1 wherein said nano-network is random. 4. The programmable molecular device according to claim 1 wherein said device is programmable by a self-adaptive algorithm for configuring said molecular circuit components. 5. The programmable molecular device according to claim 4 wherein said self-adaptive algorithm is selected from the group consisting of genetic algorithms, simulated annealing algorithms, go with the winner algorithms, temporal difference learning algorithms, reinforcement learning algorithms, and combinations thereof. 6. The programmable molecular device according to claim 4 wherein said molecular circuit components are configurable by applying a voltage across said input lead and said output lead. 7. The programmable molecular device according to claim 1 wherein said device is programmable to function as a logic unit. 8. The programmable molecular device according to claim 7 wherein said logic unit is selected from the group consisting of truth tables supported by said at least one input lead and said at least one output lead. 9. The programmable molecular device according to claim 8 wherein said logic unit is programmable to function as a device selected from the group consisting of an AND, an OR, an XOR, a NAND, a NOT, an Adder, a Half-adder, an Inverse Half-Adder, a Multiplexor, and a Decoder, and combinations thereof. ■ 10. The programmable molecular device according to claim 1 wherein said device is programmable to function as a memory unit. 11. The programmable molecular device according to claim 1 wherein said device is reprogrammable. 12. The programmable molecular device according to claim 1 wherein said molecular circuit components are selected from the group consisting of molecular switches, molecular diodes, molecular wires, molecular rectifiers, resistors, transistors, molecular memory, and combinations thereof. 13. The programmable molecular device according to claim 12 wherein said molecular circuit components comprise molecular switches. 14. The programmable molecular device according to claim 13 wherein said device is programmable by an algorithm for setting said molecular switches. 15. The programmable molecular device according to claim 14 wherein said switches are settable by applying a voltage across said input lead and said output lead. 16. The programmable molecular device according to claim 1 wherein said nano-network further comprises nanoscale components. 17. The programmable molecular device according to claim 16 wherein said nanoscale components are selected from the group consisting of nanotubes, nanoparticles, nanorods, and combinations thereof. 18. The programmable molecular device according to claim 17 wherein said nanoscale circuit components comprise nanoparticles and said molecular circuit components comprise molecular switches and said molecular switches interconnect said nanoparticles. 19. The programmable molecular device according to claim 18 wherein said nanoparticles are randomly arrayed. 20. The programmable molecular device according to claim 18 wherein said molecular switches randomly interconnect said nanoparticles. 21. A method of making an electronic component, comprising: (a) providing a self-assembled nanocell; and (b) programming the nanocell to function as the electronic component. 22. The method according to claim 21 wherein the nanocell comprises: at least one input lead; at least one output lead; and a nano-network spanning the input lead and the output lead, wherein the nano- network comprises a plurality of molecular circuit components. 23. The method according to claim 22 wherein the molecular circuit components are selected from the group consisting of molecular switches, molecular diodes, molecular wires, molecular rectifiers, molecular resistors, molecular transistors, molecular memories and combinations thereof. 24. The method according to claim 23 wherein the molecular circuit components comprises molecular resonant tunneling diodes. 25. The method according to claim 24 wherein the molecular circuit components exhibit negative differential resistance. 26. The method according to claim 22 wherein the nano-network further comprises nanoscale components selected from the group consisting of nanotubes, nanoparticles, nanorods, and combinations thereof. 27. The method according to claim 22 wherein said nano-network is random. 28. The method according to claim 21 wherein step (b) comprises: (bl) configuring the molecular circuit components. 29. The method according to claim 28 wherein step (bl) comprises: (bl.i) adjusting a conductivity-affecting property of at least one of the molecular circuit components by applying a voltage across the input lead and the output lead. 30. The method according to claim 29 wherein the conductivity-affecting property is selected from the group consisting of charge, conformational state, electronic state, and combinations thereof. 31. The method according to claim 28 wherein step (b) further comprises: (b2) testing the performance of the nanocell. 32. The method according to claim 31 wherein step (b) further comprises: (b3) applying a self-adaptive algorithm to reconfigure the molecular circuit components. 33. The method according to claim 32 wherein the self-adaptive algorithm is selected from the group consisting of genetic algorithms, simulated annealing algorithms, go with the winner algorithms, temporal difference learning learning algorithms, reinforcement learning algorithms, and combinations thereof. 34. The method according to claim 32 further comprising: (b4) repeating steps (b2) and (b3) until the nanocell functions as the electronic component. 35. The method according to claim 22 wherein the electronic component comprises a logic unit. 36. The method according to claim 35 wherein the logic unit is selected from the group consisting of truth tables supported by the input leads and output leads. 37. The method according to claim 36 wherein the logic unit is selected from the group consisting of an AND, an OR, an XOR, a NOR, an NAND, a NOT, an Adder, a Half-Adder, an Inverse Half- Adder a Multiplexor, a Decoder, and combinations thereof. 38. The method according to claim 22 wherein the electronic component comprises a memory unit. 39. The method according to claim 22 wherein step (a) comprises: (al) allowing a plurality of nanoscale components to self-assemble into a random array; (a2) allowing the plurality of molecular circuit components to self-assemble into a random molecular interconnect between the nanoscale components; and (a3) bonding the molecular circuit components to the nanoscale components with molecular alligator clips. 40. The method according to claim 39 wherein the molecular alligator clips are selected from the group consisting of sulfur, oxygen, selenium, phosphorous, isonitrile, pyidine, carboxylate, and thiol moieties. 41. The method according to claim 39 wherein the nanoscale components are selected from the group consisting of nanotubes, nanoparticles, nanorods, and combinations thereof. 42. The method according to claim 39 wherein the molecular circuit components are selected from the group consisting of molecular switches, molecular diodes, molecular wires, molecular rectifiers, molecular resistors, molecular transistors and combinations thereof. 43. A molecular computer, comprising: a plurality of programmable nanocells, each nanocell comprising: a plurality of nanoparticles; and a plurality of molecular diodes; wherein said molecular diodes interconnect said nanoparticles; and a plurality of metallic wires; wherein said metallic wires interconnect said nanocells. 44. The molecular computer according to claim 43 wherein said nanocell is self-assembled. 45. The molecular computer according to claim 43 wherein said nanoparticles are randomly arrayed. 46. The molecular computer according to claim 43 wherein said molecular diodes randomly interconnect said nanoparticles. 47. The molecular computer according to claim 43 wherein each said nanocell comprises a linear dimension of up to about 2 microns. 48. The molecular computer according to claim 43 wherein at least one of said nanocells is programmable to function as a logic unit. 49. The molecular computer according to claim 48 wherein said logic unit is selected from the group consisting of truth tables supported by the wire interconnection. 50. The • method according to claim 49 wherein at least one of said nanocells is programmable to function as a device selected from the group consisting of AND, OR, XOR, NOR, NAND, NOT, an Adder, a Half Adder, an Inverse Half Adder, a Multiplexor, a Decoder, and combinations thereof. 51. The molecular computer according to claim 43 wherein at least one of said nanocells is programmable to function as a memory unit. 52. The molecular computer according to claim 43 wherein said nanocell is programmable by an algorithm for configuring said nanocell's molecular diodes. 53. The molecular computer according to claim 43 wherein said said nanocell further comprises: first and second leads; and wherein said diodes are configurable by applying a voltage to said first and second leads. 54. The molecular computer according to claim 43 wherein at least one of said molecular diode exhibits negative differential resistance. 55. A method of maldng a computer, comprising: (a) providing a plurality of trained self-assembled nanocells; (b) interconnecting said trained nanocells to a plurality of untrained nanocells; (c) allowing the trained nanocells to train the untrained nanocells. 56. The method according to claim 53, further comprising: (d) hierarchically repeating steps (b) and (c).

Inventors: HUSBAND CHRISTOPHER, HUSBAND SUMMER, TOUR JAMES M, VAN ZANDT BILL, HUSBAND, CHRISTOPHER, HUSBAND, SUMMER, TOUR, JAMES, M., VAN ZANDT, BILL
Applicants: UNIV WM MARSH RICE, WM. MARSH RICE UNIVERSITY
Application year: 2001
Main classification: G11C11
IPC codes: C07D213, G06N1, G06N3, G11C11, G11C13, H01L51, H03K19