Hello,
VectorParam seems to do the trick and I can now pass the list I need from
Python to C++.
Thanks for your help.
Best regards,
Alex Tomala
________________________________
From: Steve Reinhardt <[email protected]>
To: Alex Tomala <[email protected]>
Cc: gem5 mailing list <[email protected]>
Sent: Thursday, January 2, 2014 8:18:45 PM
Subject: Re: [gem5-users] Calling a C++ function in Python
No, VectorParams are typed just like scalar params:
example_int = Param.Int("Description")
example_vector = VectorParam.Int("Description")
Steve
On Thu, Jan 2, 2014 at 5:02 PM, Alex Tomala <[email protected]> wrote:
Hello,
>
>
>VectorParam seems to be a life saver for me, but I have one question about it.
>VectorParam seems to ask for a generic vector, which doesn't exist in C++. I
>presume that the parameter will have to be casted to a MachineID vector,
>before using it in C++.
>
>
>Also, I presume that you declare the parameter in a similar way as an integer
>would be done, like this:
>
>
>example_int = param.Int("Description")
>example_vector = param.VectorParam("Description")
>
>
>Best regards,
>
>
>Alex Tomala
>
>
>
>________________________________
>
>From: Steve Reinhardt <[email protected]>
>To: Alex Tomala <[email protected]>
>
>Cc: gem5 mailing list <[email protected]>
>Sent: Thursday, January 2, 2014 7:47:47 PM
>
>Subject: Re: [gem5-users] Calling a C++ function in Python
>
>
>
>Yea, you can't create the C++ versions of the objects until you've finalized
>the topology in Python, and you obviously can't call a C++ method until the
>C++ object is created.
>
>
>If you're just passing information from the Python to the C++, parameters are
>a much simpler and more natural way to do it anyway. You can use a
>VectorParam if you want to pass in a list of things. The conversion from a
>Python list to a C++ vector is handled automagically by SWIG.
>
>
>Steve
>
>
>
>
>
>On Thu, Jan 2, 2014 at 4:39 PM, Alex Tomala <[email protected]> wrote:
>
>Hello,
>>
>>
>>I can see how this is a problem. In this case, I assume that it is impossible
>>to pass the C++ function to the topology configuration file. I assume that I
>>will have to use parameters instead.
>>
>>
>>addChild is used to add a MachineID to a C++ vector. I suppose that I can
>>create a list of MachineIDs in Python and add the list to the ChildStates as
>>a parameter. I am wondering how the python list can be converted to a C++
>>vector object, as I do not know how.
>>
>>
>>Best regards,
>>
>>
>>Alex
>>
>>
>>
>>________________________________
>>
>>From: Steve Reinhardt <[email protected]>
>>To: Alex Tomala <[email protected]>
>>Cc: gem5 mailing list <[email protected]>
>>Sent: Thursday, January 2, 2014 7:00:43 PM
>>
>>Subject: Re: [gem5-users] Calling a C++ function in Python
>>
>>
>>
>>OK, I think I see one potential problem... note that in SimObject.py where
>>you're getting the error we have this code:
>>
>>
>> # If the attribute exists on the C++ object, transparently
>> # forward the reference there. This is typically used for
>> # SWIG-wrapped methods such as init(), regStats(),
>> # resetStats(), startup(), drain(), and
>> # resume().
>> if self._ccObject and hasattr(self._ccObject, attr):
>> return getattr(self._ccObject, attr)
>>
>>
>> raise AttributeError, "object '%s' has no attribute '%s'" \
>> % (self.__class__.__name__, attr)
>>
>>
>>So in spite of the text of the error message, you could be failing because
>>_ccObject (the pointer to the swig-wrapped C++ object) is not set up (i.e.,
>>because the corresponding C++ object has not been created), not because the
>>attribute doesn't exist. (Or strictly speaking, because the attribute won't
>>exist on the swig-wrapped C++ object once it has been created.) Given that
>>your code snippet shows you calling the constructor and then trying to call
>>addChild() right away without a call to root.instantiate(), I'm guessing
>>that's your problem here.
>>
>>
>>Steve
>>
>>
>>
>>
>>
>>On Thu, Jan 2, 2014 at 3:48 PM, Alex Tomala <[email protected]> wrote:
>>
>>The method seems to show up in both files, which I have attached to this
>>email. Looking over the SWIG documentation briefly, I found no problems with
>>the files.
>>>
>>>
>>>- Alex
>>>
>>>
>>>
>>>________________________________
>>>
>>>From: Steve Reinhardt <[email protected]>
>>>To: Alex Tomala <[email protected]>
>>>Cc: gem5 mailing list <[email protected]>
>>>Sent: Thursday, January 2, 2014 6:35:43 PM
>>>
>>>Subject: Re: [gem5-users] Calling a C++ function in Python
>>>
>>>
>>>
>>>And yet the addChild method is showing up in
>>>build/*/python/m5/internal/param_ChildStates.i? Is it also in the
>>>param_ChildStates.py file in that same directory?
>>>
>>>
>>>
>>>On Thu, Jan 2, 2014 at 3:29 PM, Alex Tomala <[email protected]> wrote:
>>>
>>>Hello,
>>>>
>>>>
>>>>In the topology configuration file I accidentally did
>>>>childStates.getChild(child), instead of childStates.addChild(child). When I
>>>>fixed it, I still got the exact same error, which is:
>>>>
>>>>
>>>> childStates.addChild(child)
>>>>
>>>> File "/home/alex/Desktop/gem5/gem5-stable/src/python/m5/SimObject.py",
>>>>line 725, in __getattr__
>>>> % (self.__class__.__name__, attr)
>>>>AttributeError: object 'ChildStates' has no attribute 'addChild'
>>>>
>>>>
>>>>Best regards,
>>>>
>>>>
>>>>Alex Tomala
>>>>
>>>>________________________________
>>>>
>>>>From: Steve Reinhardt <[email protected]>
>>>>To: Alex Tomala <[email protected]>
>>>>Cc: gem5 users mailing list <[email protected]>
>>>>Sent: Thursday, January 2, 2014 6:16:24 PM
>>>>
>>>>Subject: Re: [gem5-users] Calling a C++ function in Python
>>>>
>>>>
>>>>
>>>>I'm a little confused about where the 'getChild' call is coming from since
>>>>'addChild' is the method you added... are you leaving some parts out of the
>>>>code you're posting?
>>>>
>>>>
>>>>
>>>>On Thu, Jan 2, 2014 at 3:09 PM, Alex Tomala <[email protected]> wrote:
>>>>
>>>>Hello Steve,
>>>>>
>>>>>
>>>>>I tried the following in a topology configuration file:
>>>>>
>>>>>
>>>>>childStates = ChildStates()
>>>>>childStates.addChild(child) #child is the MachineID
>>>>>
>>>>>
>>>>>When I run gem5 I get the following error:
>>>>>
>>>>>
>>>>> childStates.getChild(child)
>>>>>
>>>>> File "/home/alex/Desktop/gem5/gem5-stable/src/python/m5/SimObject.py",
>>>>>line 725, in __getattr__
>>>>> % (self.__class__.__name__, attr)
>>>>>AttributeError: object 'ChildStates' has no attribute 'getChild'
>>>>>
>>>>>
>>>>>This is the only method I tried, but I can't think of any other method to
>>>>>get it done.
>>>>>
>>>>>
>>>>>One day I may add some information to the wiki, but I am a tad busy now.
>>>>>
>>>>>
>>>>>Best regards,
>>>>>
>>>>>
>>>>>Alex Tomala
>>>>>
>>>>>________________________________
>>>>>
>>>>>From: Steve Reinhardt <[email protected]>
>>>>>To: Alex Tomala <[email protected]>; gem5 users mailing list
>>>>><[email protected]>
>>>>>Sent: Thursday, January 2, 2014 5:22:47 PM
>>>>>Subject: Re: [gem5-users] Calling a C++ function in Python
>>>>>
>>>>>
>>>>>
>>>>>What have you tried and what problems are you having? It should just be a
>>>>>matter of calling 'obj.addChild(x)' on your ChildStates object 'obj'.
>>>>>
>>>>>
>>>>>It looks like you've figured most of this out already, but a lot of the
>>>>>current mechanism was added in this changeset (see particularly the
>>>>>comments in the added code in SimObject.py):
>>>>>http://repo.gem5.org/gem5/rev/45c9f664a365
>>>>>
>>>>>
>>>>>And here's an example of adding a method:
>>>>>http://repo.gem5.org/gem5/rev/09dcdb40b109
>>>>>
>>>>>
>>>>>If you're feeling ambitious, it would be great if you'd be willing to
>>>>>write up some documentation on how to add callable functions on the wiki,
>>>>>say on this page (or a page linked from it):
>>>>>http://gem5.org/SimObjects
>>>>>
>>>>>
>>>>>
>>>>>Thanks,
>>>>>
>>>>>
>>>>>Steve
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>On Thu, Jan 2, 2014 at 1:38 PM, Alex Tomala <[email protected]> wrote:
>>>>>
>>>>>Hello,
>>>>>>
>>>>>>
>>>>>>I partially figure out the solution to the problem. I figured out that
>>>>>>you can over ride the exports_method method from the sim object python
>>>>>>file to add functions. Now my Python interfacing file looks like this:
>>>>>>
>>>>>>
>>>>>> from m5.params import *
>>>>>>from m5.SimObject import SimObject
>>>>>>from Controller import RubyController
>>>>>>
>>>>>>
>>>>>>class ChildStates(SimObject):
>>>>>>type = 'ChildStates'
>>>>>>cxx_class = 'ChildStates'
>>>>>>cxx_header = '"mem/protocol/ChildStates.hh"
>>>>>>childPorts = Param.Int("Number of Children Ports")
>>>>>>@classmethod
>>>>>>def export_methods(cls, code):
>>>>>> code('''
>>>>>>void addChild(MachineID child);
>>>>>>''')
>>>>>>
>>>>>>
>>>>>>The *.i file associated with the custom SimObject now contains the proper
>>>>>>method. My only problem that I have now is that I don't know how to call
>>>>>>the method in Python. I am guessing that I am importing the wrong module
>>>>>>or something similar.
>>>>>>
>>>>>>
>>>>>>- Alex
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>________________________________
>>>>>> From: Alex Tomala <[email protected]>
>>>>>>To: gem5 mailing list <[email protected]>
>>>>>>Sent: Wednesday, January 1, 2014 5:03:13 PM
>>>>>>Subject: Calling a C++ function in Python
>>>>>>
>>>>>>
>>>>>>
>>>>>>Hello,
>>>>>>
>>>>>>
>>>>>>I created a custom SimObject in C++ that has a function that I want to
>>>>>>execute in Python. I am wondering how I can interface the function to
>>>>>>Python as instance.function_name does not seem to work. The function I am
>>>>>>using is called addChild and it takes a MachineID as an input.
>>>>>>
>>>>>>
>>>>>>My current Python interfacing file looks like this:
>>>>>>
>>>>>>
>>>>>>from m5.params import *
>>>>>>from m5.SimObject import SimObject
>>>>>>from Controller import RubyController
>>>>>>
>>>>>>
>>>>>>class ChildStates(SimObject):
>>>>>>type = 'ChildStates'
>>>>>>cxx_class = 'ChildStates'
>>>>>>cxx_header = '"mem/protocol/ChildStates.hh"
>>>>>>childPorts = Param.Int("Number of Children Ports")
>>>>>>
>>>>>>
>>>>>>Best regards,
>>>>>>
>>>>>>
>>>>>>Alex
>>>>>>
>>>>>>
>>>>>>_______________________________________________
>>>>>>gem5-users mailing list
>>>>>>[email protected]
>>>>>>http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>
>>
>>
>
>
>_______________________________________________
gem5-users mailing list
[email protected]
http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users