1. A method of configuring and programming a multi-core processor for execution of application software, the method comprising: providing a multi-core processor comprising: a plurality of processing units capable of executing intrinsic operations; a plurality of memory blocks; a plurality of cognitive data routing units that can be configured or programmed to route data from any of the processing unit to any of the memory blocks, from any of the processing units to any other of the processing units, from any of the memory blocks to any of the processing units, and from any of the memory blocks to any other of the memory blocks; and a cognitive on-chip network comprising a network of ports, each port comprising a data channel and a protocol channel, the network being able to connect ports together by connecting the output data channels to the input data channels and the bi-directional protocol channels to each other; the cognitive data routing units and the cognitive on-chip network being able to form communication channels between the processing units with or without assistance from the memory blocks; partitioning the application software into a plurality of separate modules that form a dependency graph having an edge that indicates data flow between the modules; determining which modules should be executed in series on common hardware, in program-driven parallel on different hardware, and in data-driven parallel on different hardware, according to the following rules: 1) only modules having multiple sets of inputs can execute in data-driven parallel on different hardware; 2) modules having no data flow between them can execute in parallel on different hardware without using cognitive data routing network resources or cognitive on-chip network resources; 3) modules having data flow between them can execute in parallel on different hardware with usage of cognitive data routing network and cognitive on-chip network resources for routing data between the different hardware; and 4) all modules can execute in series on same hardware estimating a computation requirement for each of the modules; estimating data flow requirements between the modules; assigning hardware computation resources to each of the module in two dimensions according to specific processing units used by each module and computational time requirements based on the determined computation requirement in addition to a specified time overhead; assigning data routing resources in two dimensions, according to specific cognitive data routing units and cognitive on-chip network units and the data flow time requirements based on the determined data flow requirements in addition to a specified time overhead; and using an automatic tool to generate machine code for execution by the processor.