1. A method of designing a digital memory system, said method comprising: receiving a set of desired memory characteristics from a circuit designer; generating a plurality of possible memory designs that meet said desired memory characteristics, at least one of said possible memory designs comprising at least one intelligent memory controller, and at least one fundamental memory circuit; selecting a subset of said plurality of possible memory designs, said subset of said plurality of possible memory designs optimized for a set of optimization parameters; and outputting said subset of said plurality of possible memory designs.