The distinction between hardware and software is also related to the idea of functional architecture. When we describe a Mac, what's important is not its physical architecture (layout, etc) but its functional architecture. I.e. the basic processing elements (accumulator, memory, program counter, instruction register) and operations (the machine-code instructions).
As I've said above, you could realise the same functional architecture on machines with widely differing physical structure. It's possible of course to have many different functional architectures. The differences might be big - the difference between a production system and my example computer. They might be smaller - a difference in the number of registers, or in the details of the machine code. Or they might just be a matter of different restrictions - differing size of memory.
This is where the idea of the functional architecture of cognition comes from: see the production-systems lecture and my notes on production systems for the Prolog practical.