For the purposes of this algorithm, an origami array is a two-dimensional staggered array of nodes as described above. In a fully automated logical compiler it might be desirable to treat each node independently for placement. However, in a large application the number of nodes may be very large (equal to the number of discrete logical functions that need to be performed) and compilation time quickly increases beyond the realm of practicality. Therefore it is frequently desirable to break down the problem into subproblems, and place and route the nodes required for each subproblem separately or perhaps even by hand. Once the placement and routing for a subproblem has been produced, we can consider the result to be an atomic unit for future connection to other nodes and subproblems. Such a subproblem is called a module, and is considered in this algorithm to be an by rectangular set of nodes with defined input and output locations. Typical modules might be adders, multipliers, and bus multiplexors. Individual ungrouped nodes are also considered to be modules.
This algorithm assumes that there are four flavors dedicated to routing. They are:
A series of connected routing flavors is called a wire.
The algorithm requires the following data as input:
Program inputs and outputs are treated as special modules that are used during routing, but are not actually placed in the physical array.