1. A method of designing a digital circuit comprising the steps of: capturing a digital circuit design as a plurality of high level arithmetic and logical functions; providing a library of arithmetic and logical components corresponding to the plurality of high level arithmetic and logical functions, wherein the arithmetic and logical components are adaptable to a plurality of data types and precisions, wherein said data types include encoding information; assigning a component from the library to each function; inputting a user-selected data type and precision in the digital circuit; propagating the selected data type and precision through the digital circuit; and adapting at least one component as a result of the step of propagating.