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 <orla...@grame.fr> 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 <o...@redhat.com> 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 > Faudiostream-users@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/faudiostream-users _______________________________________________ Faudiostream-users mailing list Faudiostream-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/faudiostream-users