Interfacing function
eng


BUSCREATOR

File content


function [x,y,typ]=BUSCREATOR(job,arg1,arg2)
// Copyright INRIA
x=[];y=[];typ=[];
select job
case 'plot' then
  standard_draw(arg1)
case 'getinputs' then
  [x,y,typ]=standard_inputs(arg1)
case 'getoutputs' then
  [x,y,typ]=standard_outputs(arg1)
case 'getorigin' then
  [x,y]=standard_origin(arg1)
case 'set' then
  x=arg1;
  graphics=x.graphics;model=x.model;
  exprs=graphics.exprs
  old_exprs=exprs(2)(1)
  ok=%f;okk=%t
  while ~ok do
    [ln,fun]=where();
    if find (fun=="SUPER_f")<>[] then
      v=find (fun=="SUPER_f")
      fun=fun(1:v(1)-1)
    end
    if or(fun=="clickin") then
      label=[exprs(2)(1);exprs(3);exprs(4)]  //just for test
      [okk,Signals,inputbus,InheritSignal,label]=getvalue('This is just for test',..
	  ['Signals Name';'Buses Number';'Names inheritance (0=yes 1=no)'],..
	  list('string',1,'vec',1,'vec',1),label); //just for test
      Signals=evstr(Signals);
      inputnb=size(Signals,'*');
      //[okk,inputnb,inputbus,Signals,InheritSignal]=BusCreatorProperties(exprs)
    else
      inputnb=size(find(graphics.in_implicit=='E'),'*');
      inputbus=size(find(graphics.in_implicit=='B'),'*');
      Signals=evstr(exprs(2)(1))
      InheritSignal=evstr(exprs(4))
    end
    ok=okk;
    if ~okk then return;end
    if inputnb+inputbus<2 then message('Input number must be greater than 2');ok=%f;end
    SS=unique(Signals)
    if size(SS,'*')<inputnb then message('Two or more Signals have same name');ok=%f;end
    okk=ok;
    if ok then
      in=[-[1:inputnb+inputbus]' -(inputnb+inputbus+[1:inputnb+inputbus]')];
      it=-[1:inputnb+inputbus]';
      //[model,graphics,ok]=set_io(model,graphics,list(in,it),list([0 0],-1),[],[],[],[],[inputnb+1:inputnb+inputbus],1)
      model.in=in(:,1)
      model.in2=in(:,2)
      model.intyp=it
      old_inputnb=size(find(graphics.in_implicit=='E'),'*');
      old_inputbus=size(find(graphics.in_implicit=='B'),'*');
      if inputnb>old_inputnb then
	graphics.pin=[graphics.pin(1:old_inputnb,1);zeros(inputnb-old_inputnb,1);graphics.pin(old_inputnb+1:$,1)];
      else
	graphics.pin=[graphics.pin(1:inputnb,1);graphics.pin(old_inputnb+1:$,1)];
      end
      if inputbus>old_inputbus then
	graphics.pin=[graphics.pin;zeros(inputbus-old_inputbus,1)];
      elseif inputbus<old_inputbus then
	graphics.pin(inputnb+inputbus+1:$,:)=[];
      end
      //graphics.signal_propagated=[exprs(2)(1)(:);exprs(2)(2)(:)]
      I1='E';I2='B';
      in_impl=[I1(ones(1:inputnb)) I2(ones(1:inputbus))];
      graphics.in_implicit=in_impl
      if and(graphics.pin(inputnb+1:inputnb+inputbus)==0) then
	//[BS,ok]=FindSignalsInBus(x,scs_m,graphics.pin(port))
	exprs(2)(2)=list()
      end
      BS=list2vec(exprs(2)(2))
      SS=[Signals(:);BS(:)];
      [SS1,ind]=unique(SS);
      indx=setdiff([1:size(SS,'*')]',ind(:))
      if indx<>[] then
	message('The input signal ""'+SS(indx(:))+'"" is already a signal in the input bus');ok=%f;
      else
	exprs(1)=sci2exp(inputnb)
	exprs(2)(1)=sci2exp(Signals(:))
	exprs(3)=sci2exp(inputbus)
	exprs(4)=sci2exp(InheritSignal)
	if old_exprs<>exprs(2)(1) then needcompile=4;y=needcompile;end
	graphics.exprs=exprs;
	if inputnb+inputbus>3 then graphics.sz=[10 40+(inputnb+inputbus-3)*10];end     
	x.model=model;x.graphics=graphics;
	break
      end
    end
  end
  needcompile=resume(needcompile);
case 'define' then
  in=2
  model=scicos_model()
  model.sim='buscreator'
  model.in=-[1:in]'
  model.in2=-(in+[1:in]')
  model.intyp=-[1:in]'
  model.out=0
  model.outtyp=-1
  model.opar=list()
  model.blocktype='c'
  model.dep_ut=[%t %f]
  // exprs contains 
  //exprs(1)=nbre of input port
  //exprs(2)= it is a list
  //exprs(2)(1) --> the input signals
  //exprs(2)(2) --> the input buses
  //exprs(3) --> number of input buses
  //exprs(4) --> option (0 or 1)
  //exprs=list(string(in),mlist(['Type','SignalName','Bus'],['Signal1','Signal2'],mlist(['Type','BusName','SignalName','Bus'],[],[],list())),string(0),string(0))
  exprs=list(string(in),list(sci2exp(['Signal1';'Signal2']),[]),'0','0') // just for test
  //exprs(5) contient la matrice de correspondance entre les bus et les signaux (a voire).
  gr_i=' ' //'xstringb(orig(1),orig(2),''BUS'',sz(1),sz(2),''fill'')'
  x=standard_define([.5 2],model,exprs,gr_i)
  x.graphics.id="BUS"
  x.graphics.in_implicit=["E","E"]
  x.graphics.out_implicit="B"
end
endfunction

function [ok,inputnb,inputbusnb,Signals,InheritSignal]=BusCreatorProperties(exprs)
inputnb=eval(exprs(1))
SigVal=[]
M=exprs(2)
signalsinput=M.SignalName
for i=1:size(signalsinput,'*')
  ind=strindex(signalsinput(i),' ');
  if ind<>[] then 
    SigVal=[SigVal;strcat(['{',signalsinput(i),'}'])]
  else 
    SigVal=[SigVal;signalsinput(i)];
  end
end
BusInput=exprs(2)(2)
options=['Inherit bus signals names from input port';
    'Require input signals names to match signals below']
origopt=options(evstr(exprs(4))+1)
inputbusnb=eval(exprs(3))
txt=['set BWpath [file dirname '"$env(SCIPATH)/tcl/BWidget-1.7.0'"]'
     'if {[lsearch $auto_path $BWpath]==-1} {'+..
     'set auto_path [linsert $auto_path 0 $BWpath]'+..
     '}'
     'package require BWidget 1.7.0'
     'namespace inscope :: package require BWidget'
    'set www .buscreatorxx'
    'catch {destroy $www}'
    'toplevel $www'
    'set numx [winfo pointerx .]'
    'set numy [winfo pointery .]'
    'wm geometry $www +$numx+$numy'
    'wm title $www '"Parameters'"'
    'wm iconname $www '"buscreator'"'
    '#positionWindow $www'
     'frame $www.buttons'
    'pack $www.buttons -side bottom -fill x -pady 2m'
    'button $www.buttons.dismiss -text Dismiss -command {set done 2}'
    'button $www.buttons.code -text OK -command {set done 1}'
    'pack $www.buttons.dismiss $www.buttons.code -side left -expand 1'
    'frame $www.rename'
    'pack $www.rename -side bottom -fill x -pady 2m'
    'label $www.rename.lab -text ""Rename Selected Signal""'
    'entry $www.rename.entry -relief sunken -width 15 '
    '$www.rename.entry configure -state disabled'
    'pack $www.rename.lab $www.rename.entry -side left -expand 1'   
    'frame $www.signal'
    'global SignalNumber;set SignalNumber '+sci2exp(inputnb)
    'global BusNumber;set BusNumber '+sci2exp(inputbus)
    'pack $www.signal -side bottom -fill x -pady 2m'
    'lappend SignalsList '+strcat([SigVal' BusInput'],' '); 
    'listbox $www.signal.lst'
    '$www.signal.lst configure -listvariable SignalsList'
    'Tree $www.signal.tr'
    '$www.signal.lst delete 0 end']
for i=1:size(SigVal,'*')
  txt=[txt;['$www.signal.tr insert end root Signal'+sci2exp(i)+' -text '+SigVal(i);
            '$www.signal.lst insert end '+SigVal(i);
            ]];
end
j=i;
for i=1:size(BusInput,'*')
  txt=[txt;['$www.signal.lst insert end '+BusInput(i);
            '$www.signal.tr insert end root Bus'+sci2exp(i)+' -text '+BusInput(i);
            ]];
  execstr('for k=1:size(SigBus'+BusInput(i)+',''*'') '+..
            'txt=[txt;[''$www.signal.tr insert end Bus'+sci2exp(i)+' Bus'+sci2exp(i)+'Sig''+sci2exp(k)+'' -text ''+SigBus'+BusInput(i)+'(k)]];end')
end
  txt=[txt;
    'button $www.signal.refresh -text Refresh '
    'pack $www.signal.refresh -side right -expand 1' 
    'pack $www.signal.tr -side left -expand 1'
    'pack forget $www.signal.lst'];
txt=[txt;
    ['frame $www.inputbus'
	'pack $www.inputbus -side bottom -fill x -pady 2m'
	'label $www.inputbus.lab -text ""Number of input Buses""'
     'entry $www.inputbus.entry -relief sunken -width 15'
     '$www.inputbus.entry insert 0 ""'+sci2exp(size(BusInput,'*'))+'""'
     'pack $www.inputbus.lab $www.inputbus.entry -side left -expand 1']];
txt=[txt;
    ['frame $www.input'
	'pack $www.input -side bottom -fill x -pady 2m'
	'label $www.input.lab -text ""Number of input Signals""'
	'entry $www.input.entry -relief sunken -width 15'
	'$www.input.entry insert 0 ""'+sci2exp(inputnb)+'""'
	'pack $www.input.lab $www.input.entry -side left -expand 1'
     'frame $www.inherit'
	'pack $www.inherit -side bottom -fill x -pady 2m'
	'set opt ""'+origopt+'""'
	'tk_optionMenu $www.inherit.menu opt ""'+options(1)+'"" ""'+options(2)+'""'
	'pack $www.inherit.menu -side left -expand 1'
	'frame $www.def'
	'pack $www.def -side bottom -fill x -pady 2m'
	'label $www.def.lab -text ""This block creates a bus signal from its inputs""'
	'pack $www.def.lab -side left -expand 1']];
tt= 'global opt;'+..
     'pack forget $www.signal.tr;'+..
     'pack forget $www.signal.lst;'+..
    'if {$opt == ""'+options(2)+'""} {'+..
    'pack $www.signal.lst -side left -expand 1;'+..
    '} '+..
   'else {'+..
   'pack $www.signal.tr -side left -expand 1;'+..
   '}'
txt=[txt;
     ['proc updatelist {www} {'+tt+'}']]; 
tt= 'global opt;'+..
    'if {$opt == ""'+options(2)+'""} {'+..
    '$www.rename.entry configure -state normal;'+..
    'global SelectedSignal;set SelectedSignal [$www.signal.lst curselection];'+..
    '$www.signal.lst configure -state disabled;'+..
    '$www.input.entry configure -state disabled;'+..
    '$www.inputbus.entry configure -state disabled;}'
txt=[txt;
    ['proc doubleclick {www} {'+tt+'}']];
tt='global SignalNumber;global BusNumber;'+..
   'set SignalState [$www.signal.lst cget -state];'+..
   'if {$SignalState!=""disabled""} {'+..
     'set InputNumber [$www.input.entry get];'+..
     'set InputBusNumber [$www.inputbus.entry get];'+..
     'if {$InputNumber > $SignalNumber} {'+..
       'incr SignalNumber;'+..
       'for {set i $SignalNumber} {$i <= $InputNumber} {incr i} {'+..
       'set SignalPosition [expr $i-1];'+..
         '$www.signal.lst insert $SignalPosition ""Signal$i"";'+..
         '$www.signal.tr insert $SignalPosition root Signal$i -text ""Signal$i"";};'+..
	  '} '+..
	'elseif {$InputNumber < $SignalNumber} {'+..
	  '$www.signal.lst delete $InputNumber [expr $SignalNumber-1];'+..
	  'for {set i $InputNumber} {$i <=$SignalNumber} {incr i} {'+..
	    '$www.signal.tr delete Signal[expr $i+1];}};'+..
     'set SignalNumber $InputNumber;'+..
     'if {$InputBusNumber > $BusNumber} {'+..
       'incr BusNumber;'+..
       'for {set i $BusNumber} {$i <= $InputBusNumber} {incr i} {'+..
       'set SignalPosition [expr $i+$SignalNumber-1];'+..
         '$www.signal.lst insert $SignalPosition ""Bus$i"";'+..
         '$www.signal.tr insert $SignalPosition root Bus$i -text ""Bus$i"";};'+..
	  '} '+..
	'elseif {$InputBusNumber < $BusNumber} {'+..
	  '$www.signal.lst delete [expr $InputBusNumber+$SignalNumber] [expr $BusNumber+$SignalNumber];'+..
	  'for {set i $InputBusNumber} {$i <=$BusNumber} {incr i} {'+..
	  '$www.signal.tr delete Bus[expr $i+1];}};'+..
     'set BusNumber $InputBusNumber;'+..
   '} '+..
   'else {'+..
	'global SelectedSignal;'+..
	'set RenamedSignal [$www.rename.entry get];'+..
	'$www.signal.lst configure -state normal;'+..
     'if {$RenamedSignal != """"} {'+..
       '$www.signal.lst insert $SelectedSignal ""$RenamedSignal"";'+..
       'incr SelectedSignal;'+..
       '$www.signal.lst delete $SelectedSignal;'+..
       '};'+..
       '$www.rename.entry configure -state disabled;'+..
       '$www.input.entry configure -state normal;'+..
       '$www.inputbus.entry configure -state normal;'+..
    '}'
txt=[txt;
     ['proc refresh {www} {'+tt+'}']]; 
tt='global inpnb;set inpnb [$www.input.entry get];'+..
     'global inpbus;set inpbus [$www.inputbus.entry get];'
txt=[txt;
     ['proc done1 {www} {'+tt+'}']];
txt=[txt;
     ['bind $www.inherit.menu <Expose> {refresh $www;updatelist $www}'
     'bind $www.signal.lst <Double-1> {refresh $www;doubleclick $www}'
     'bind $www.signal.refresh <ButtonRelease> {refresh $www}'
      'set done 0'
      'bind $www <Return> {set done 1}'
      'bind $www <Destroy> {set done 2}'
      'tkwait variable done'
      'if {$done==1} {refresh $www;done1 $www}']]
TCL_EvalStr(txt);
done=TCL_GetVar('done')
if done==string(1) then
  inputnb=TCL_GetVar('inpnb');
  inputbusnb=TCL_GetVar('inpbus');
  Signals=TCL_GetVar('SignalsList');
  InheritSignal=find(options==TCL_GetVar('opt'))-1
  ok=%t
  inputnb=eval(inputnb);
  inputbusnb=eval(inputbusnb);
  indxstart=strindex(Signals,'{')
  indxend=strindex(Signals,'}')
  if indxstart<>[] then
    SignalVect=part(Signals,[1:indxstart(1)-1])
    SignalVect=tokens(SignalVect)
    SignalVect=[SignalVect;part(Signals,[indxstart(1)+1:indxend(1)-1])]
    for i=2:size(indxstart,'*')
      SVect=part(Signals,[indxend(i-1)+1:indxstart(i)-1])
      SVect=tokens(SVect)
      SignalVect=[SignalVect;SVect;part(Signals,[indxstart(i)+1:indxend(i)-1])]
    end
    SVect=part(Signals,[indxend($)+1:length(Signals)])
    SVect=tokens(SVect)
    SignalVect=[SignalVect;SVect]
   else
    SignalVect=tokens(Signals);
   end
  Signals=SignalVect
else
  ok=%f;inputnb=exprs(1);Signals=exprs(2);inputbusnb=exprs(3);InheritSignal=evstr(exprs(4));
end
TCL_EvalStr('destroy $www')
endfunction