On May 22, 2019, at 10:51 AM, Andre Roberge <andre.roberge@gmail.com> wrote:



On Wed, May 22, 2019 at 9:57 AM Yanghao Hua <yanghao.py@gmail.com> wrote:
> > And this is something I have in mind for a Python DSL for HDL:

Perhaps you might be able to do what you want using an import hook. I have done some experiments with introducing some new operators that way: https://github.com/aroberge/experimental/blob/master/experimental/transformers/readme.md


You might also want to look at macropy https://github.com/lihaoyi/macropy/blob/master/readme.rst , although I don’t know if it supports new operators. 

Eric


 
> >
> > def combinational_or_sequential_logic(in: Signal, out: Signal):
> >      local_signal = Signal()
> >      local_signal <- in << 10 # read as: local_signal <- (in << 10)
> >      out <- local_signal + 5 # read as out <- (local_signal + 5)
> >      # new_signal <- 3 will raise exception, as <- does not create new object.
> >
> > And the arrow operators could also be used for bulk connections of a
> > chain of hardware modules like this:
> > module_instance1 -> instance2 -> instance3->... to naturally form a
> > hardware pipeline ... this looks very elegant.
>
>
> I think the largest problem with this idea has to do with where the new
> operator would be defined, and then where would it be used.  At first
> blush, it seems like you'd want to define the operator in one file
> (let's call it hdl.py), then import that into another file (circuit.py),
> which could use the new operator.
>
> But Python compiles circuit.py without reading hdl.py at all. It merely
> compiles "import hdl" to some bytecode to import hdl.py. So how would
> the operator's definition be used during the compilation of circuit.py?
> The compiler has no idea that new operators have been defined.

The scala implementation purely relies on the object to provide the
operator definition, e.g. "a b c" would be interpreted as "a.b(c)".
With the current implementation of the arrow operators I have, "<-"
and "->" are part of of the basic python operators pretty much like
"+" and "-". Where it relies on the object to provide the special
method "__arrow__". so, this operation could be defined in a separate
file with a base class e.g. Signal or Module, where other python
module has to import it to use it or inherit it.

In this case, essentially when python compiler reads circuit.py, it
reads hdl.py too as it is imported in circuit.py. This is exactly how
__matmult__ special method works too in PEP465.
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/