olofk / ipyxact

Python-based IP-XACT parser
MIT License
125 stars 48 forks source link

Ipxact Items can't have their own children #28

Closed saschasalles closed 3 years ago

saschasalles commented 3 years ago

Hello @olofk,

I use your library in my company, and I'm new to it. I noticed with surprise that if we add an object to another object that contains a children property then each object of that type will have the child in question.

Can an object that contains children have its own objects? Or am I using your library wrong?

Here is an example that illustrates my problem :


import ipyxact.ipyxact

f = open("/Users/saschasalles/Desktop/out.xml", "w")
component = ipyxact.ipyxact.Component()
component.name = "testname"
component.version = "1.0"
component.description = "desc"
component.vendor = "BIG COMPANY"
component.library = "library"

component.memoryMaps = ipyxact.ipyxact.MemoryMaps()
memoryMap = ipyxact.ipyxact.MemoryMap()
memoryMap.name = "RegisterMap"
memoryMap.addressUnitBits = 32
component.memoryMaps.memoryMap.append(memoryMap)

addressBlock = ipyxact.ipyxact.AddressBlock()
addressBlock.name = "FUNC"
addressBlock.width = 32
addressBlock.baseAddress = 2684485632

addressBlock2 = ipyxact.ipyxact.AddressBlock()
addressBlock2.name = "FUNC2"
addressBlock2.width = 24
addressBlock2.baseAddress = 2684485631

register1 = ipyxact.ipyxact.Register()
register1.name = "REG1"
register1.description = "desc"
register1.access = "read-write"
register1.addressOffset = 0
register1.dim = 0

addressBlock.register.append(register1)

memoryMap.addressBlock.append(addressBlock)
memoryMap.addressBlock.append(addressBlock2)
component.write(f)

generate this :

<?xml version='1.0' encoding='UTF-8'?>
<ipxact:component xmlns:ipxact="http://www.accellera.org/XMLSchema/IPXACT/1685-2014">
    <ipxact:description>desc</ipxact:description>
    <ipxact:vendor>BIG COMPANY</ipxact:vendor>
    <ipxact:library>library</ipxact:library>
    <ipxact:name>testname</ipxact:name>
    <ipxact:version>1.0</ipxact:version>
    <ipxact:memoryMaps>
        <ipxact:memoryMap>
            <ipxact:name>RegisterMap</ipxact:name>
            <ipxact:addressUnitBits>32</ipxact:addressUnitBits>
            <ipxact:addressBlock>
                <ipxact:name>FUNC</ipxact:name>
                <ipxact:baseAddress>2684485632</ipxact:baseAddress>
                <ipxact:width>32</ipxact:width>
                <ipxact:register>
                    <ipxact:name>REG1</ipxact:name>
                    <ipxact:description>desc</ipxact:description>
                    <ipxact:access>read-write</ipxact:access>
                    <ipxact:addressOffset>0</ipxact:addressOffset>
                    <ipxact:dim>0</ipxact:dim>
                </ipxact:register>
            </ipxact:addressBlock>
            <ipxact:addressBlock>
                <ipxact:name>FUNC2</ipxact:name>
                <ipxact:baseAddress>2684485631</ipxact:baseAddress>
                <ipxact:width>24</ipxact:width>
                <ipxact:register>
                    <ipxact:name>REG1</ipxact:name>
                    <ipxact:description>desc</ipxact:description>
                    <ipxact:access>read-write</ipxact:access>
                    <ipxact:addressOffset>0</ipxact:addressOffset>
                    <ipxact:dim>0</ipxact:dim>
                </ipxact:register>
            </ipxact:addressBlock>
        </ipxact:memoryMap>
    </ipxact:memoryMaps>
</ipxact:component>

In this case I don't want my addressBlock2 to contain my register1.

Thank you in advance for your help, Best Regards, Sascha Salles

saschasalles commented 3 years ago

I found the solution ... it's a little bit strange behaviour 😅

You must do:

addressBlock.register = [register1]

and not:

addressBlock.register.append(register1)

By doing this we can safely add an object without populate other objects of the same type. Sascha