Reading data
************
Once created, an IntelHex object can be loaded with data. 
This is only necessary if "source" was unspecified in the constructor. 
You can also load data several times (but if addresses in those files overlap 
you get exception ``AddressOverlapError``). This error is only raised when 
reading from hex files. When reading from other formats, without explicitly 
calling ``merge``, the data will be overwritten. E.g.::

    >>> from intelhex import IntelHex
    >>> ih = IntelHex()                     # create empty object
    >>> ih.loadhex('foo.hex')               # load from hex
    >>> ih.loadfile('bar.hex',format='hex') # also load from hex
    >>> ih.fromfile('bar.hex',format='hex') # also load from hex

**NOTE**: using ``IntelHex.fromfile`` is recommended way.

All of the above examples will read from HEX files. 
IntelHex also supports reading straight binary files. For example::

    >>> from intelhex import IntelHex
    >>> ih = IntelHex()                     # create empty object
    >>> ih.loadbin('foo.bin')               # load from bin
    >>> ih.fromfile('bar.bin',format='bin') # also load from bin
    >>> ih.loadbin('baz.bin',offset=0x1000) # load binary data and place them
    >>>                                     # starting with specified offset

Finally, data can be loaded from an appropriate Python dictionary. 
This will permit you to store the data in an IntelHex object 
to a builtin dictionary and restore the object at a later time. 
For example::

    >>> from intelhex import IntelHex
    >>> ih = IntelHex('foo.hex') # create empty object
    >>> pydict = ih.todict()     # dump contents to pydict

...do something with the dictionary...

::

   >>> newIH = IntelHex(pydict) # recreate object with dict
   >>> another = IntelHex()     # make a blank instance
   >>> another.fromdict(pydict) # now another is the same as newIH
