On Wed, May 29, 2019 at 3:47 PM Ricky Teachey firstname.lastname@example.org wrote: >
I look forward to seeing the working example. Hopefully it's clear already, but: I don't think anybody is yet claiming the descriptor approach is the "correct" or "best" answer for you. But it will help a lot to demo what you want, and it also allows you to use your first choice operator, which is =.
Will keep python-ideas and all of you posted.
Problem remains that you cannot pass hdlns.x/y around, x and y are really the things you want to pass around. You can pass hdlns in this case, but the receiving object has to figure out which signal (x or y) to use.
If you can pass x around, you can certainly pass hdlns.x around, or something shorter if you prefer-- ns.x, perhaps.
Take my previous example of class C which uses class A and B, let's integrate this ns namespace:
class A: def __init__(self, in, o1, o2): self.in = in self.o1 = o1 ; self.o2 = o2 def process(self):
# is self.in, self.o1 and self.o2 are still descriptor here to be used?
class C: def __init__(self, in, out): ns.in = 0 ns.o1 = 0 ns.o2 = 0
# how should it be passed to A()? a = A(ns.in, ns.o1, ns.o2) # ?? doesn't work ... a = A(ns) # ok this works, but how does class A's instance a
figures out is it ns.in/o1/o2 need to be used? a = A(ns, ["in", "o1", "o2"]) # maybe this will do the trick?
you see, it starts to melt down ... of course it can work ... just doesn't feel right does it?
The problem of: "the receiving object has to figure out which signal (x or y) to use" seems easily addressed by creating a Signal class that knows how to return the Right Thing™ when doing math:
from numbers import Real # or whatever number abc is appropriate class Signal(Real):
# override all mathematical operations
And modify the __set__ method of the SignalBehavior descriptor so it stores a Signal:
class SignalBehavior: ... def __set__(self,inst,value): self.inst_dict[inst] = value if isinstance(value,Signal) else Signal(value)
Now any math operation you care to do can result in whatever you wish it to be:
ns = HDL() ns.x = 1 ns.y = ns.x / 2 ns.z = 8 / ns.y
I am not sure if I understood this part, the problem is how a submodule uses this signals, it is pretty clear the top module can use descriptors and hook up the assignment behavior.