Concepts are just concepts, they exist only in our minds. Implementations of concepts in computers can be classified as software or hardware (although the limits for that distinction are not definite, since most hardware runs some kind of software internally), but IP addressing is a perfectly defined idea, before it even reaches to become an implementation. The IP protocol likewise. An implementation of the TCP/IP stack in an Operating System is the only way that a dumb electronic device, such as a computer, can have a slight understanding of our brilliant concept, which is a result of human thinking.
remember ip is a protocol, it is part of the tcp/ip protocol stack and this protocol stack is a software .ipx/spx could be installed instead.
TCP/IP stack is a set of protocols. Protocols are theoretical models, defining a standard way of exchanging information. Their implementation(s), if any, is something irrelevant when we try to understand how their model works.
Obviously, the definition of a standard always precedes it's implementations, and does not in any way depend on them: a protocol (or other standard) can very well exist as a theoretical model without ever being implemented, in software or any other way. We still can talk about it and analyze it for what it is: a concept.
The fact that TCP/IP is widely implemented in software does not change anything: if we want to learn about IP addressing, we are interested in understanding the logic behind it. Because of it's complexity, it is difficult to describe a viable non-software implementation for TCP/IP, that does not mean that TCP/IP is by definition "Software"!
Someone crazy enough might even step up and create an implementation of TCP/IP using paper-parcels as packets and real people as routers. That would technically be as a valid implementation of TCP/IP as the software run by a CISCO router!