Hello,
this looks awesome!
regarding the below example by Oleg/Yann; wouldn't it make sense that, if such
a case is detected, to split the computation intop two seprate paths, i.e.
sig = x0, x1, x2, ... .
clk = 1,0,1,0,1,0,1,0,....
(clk : ondemand(sig)) => (clk : ondemand(sig_demand_1)) -> x0, x0, x1, x1, x2,
x2, ...
sig -> x0, x1, x2, x3
?
--
Till Bovermann
https://tai-studio.org | http://lfsaw.de | https://www.instagram.com/_lfsaw/
> On 21. Aug 2020, at 22:31, Yann Orlarey <[email protected]> wrote:
>
> Hi Oleg,
>
> Thank you for your example. It is very interesting because it shows that it
> is now possible to write pathological Faust programs that cannot be executed
> (without infinite memory)!
>
> Sig, having no input, therefore represents a signal, for example: x0, x1, x2,
> ... . Similarly clk, say: 1,0,1,0,1,0,1,0,....
>
> Therefore, to produce simultaneously:
> (clk : ondemand(sig))-> x0, x0, x1, x1, x2, x2, ...
> sig -> x0, x1, x2, x3
> we need to store an infinite amount of sig values!
>
> Clearly, the Faust compiler has to detect this kind of case and report an
> error...
>
> Cheers
>
> Yann
>
> Le ven. 21 août 2020 à 18:13, Oleg Nesterov <[email protected]> a écrit :
> Hi Yann,
>
> On 08/21, Yann Orlarey wrote:
> >
> > A *very* experimental implementation of the ondemand primitive is available
> > here :
> >
> > https://github.com/grame-cncm/faust/tree/experimental-ondemand
> >
> > The implementation is currently only available for -lang ocpp in scalar
> > mode. Here are some simple examples :
>
> Am I understand correctly? Currently
>
> process = (clk : ondemand(sig));
>
> acts the same as
>
> process = control(sig,clk);
>
> right?
>
> -------------------------------------------------------------------------------
> and it seems it has the same problem:
>
> clk = ffunction(int clk(), "","");
> sig = ffunction(float sig(), "","");
>
> process = (clk : ondemand(sig));
>
> compiles to
>
> virtual void compute (int count, FAUSTFLOAT** input, FAUSTFLOAT**
> output) {
> //zone1
> //zone2
> float fTemp0 = fTempPerm0;
> //zone2b
> //zone3
> FAUSTFLOAT* output0 = output[0];
> //LoopGraphScalar
> for (int i=0; i<count; i++) {
> if (clk()) {
> fTemp0 = sig();
> }
> output0[i] = (FAUSTFLOAT)fTemp0;
> }
> fTempPerm0 = fTemp0;
> }
>
> and this looks correct. However,
>
> process = (clk : ondemand(sig)), sig;
>
> results in
>
> virtual void compute (int count, FAUSTFLOAT** input, FAUSTFLOAT**
> output) {
> //zone1
> //zone2
> //zone2b
> //zone3
> FAUSTFLOAT* output0 = output[0];
> FAUSTFLOAT* output1 = output[1];
> //LoopGraphScalar
> for (int i=0; i<count; i++) {
> float fTemp0 = sig();
> output0[i] = (FAUSTFLOAT)fTemp0;
> output1[i] = (FAUSTFLOAT)fTemp0;
> }
> }
>
> and this doesn't look right...
>
> Thanks!
>
> Oleg.
>
> _______________________________________________
> Faudiostream-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/faudiostream-users
_______________________________________________
Faudiostream-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/faudiostream-users