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 <ste...@gmail.com>
To: Alex Tomala <alegomas...@yahoo.ca>
Cc: gem5 mailing list <gem5-users@gem5.org>
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 <alegomas...@yahoo.ca> 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 <ste...@gmail.com>
>To: Alex Tomala <alegomas...@yahoo.ca>
>Cc: gem5 mailing list <gem5-users@gem5.org>
>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 <alegomas...@yahoo.ca> 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 <ste...@gmail.com>
>>To: Alex Tomala <alegomas...@yahoo.ca>
>>Cc: gem5 mailing list <gem5-users@gem5.org>
>>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 <alegomas...@yahoo.ca> 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 <ste...@gmail.com>
>>>To: Alex Tomala <alegomas...@yahoo.ca>
>>>Cc: gem5 users mailing list <gem5-users@gem5.org>
>>>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 <alegomas...@yahoo.ca> 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 <ste...@gmail.com>
>>>>To: Alex Tomala <alegomas...@yahoo.ca>; gem5 users mailing list
>>>><gem5-users@gem5.org>
>>>>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 <alegomas...@yahoo.ca> 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 <alegomas...@yahoo.ca>
>>>>>To: gem5 mailing list <gem5-users@gem5.org>
>>>>>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
>>>>>gem5-users@gem5.org
>>>>>http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users
>>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>
>>
>>
>
>
>
_______________________________________________
gem5-users mailing list
gem5-users@gem5.org
http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users