// BlockDiagram.java
// Block diagram animation
//
import java.awt.*;
import java.lang.*;
import java.io.*;
import java.util.*;
import java.net.*;
public class BlockDiagram implements DrawingObj {
String label;
// int transform_case;
IOPoint input, output;
Arc arc;
Vector sum_pts;
Vector f_blks;
Vector arcs;
int x, y;
public BlockDiagram( String label ) {
this.label = new String( label );
input = output = null;
sum_pts = new Vector( 10 );
f_blks = new Vector( 10 );
arcs = new Vector( 10 );
x = y = 0;
}
public void move( int dx, int dy ) {
// Implement this as offset the whole drawing
int n,k;
input.x = input.x + dx;
input.y = input.y + dy;
output.x = output.x + dx;
output.y = output.y + dy;
n = f_blks.size();
for(k=0;k<n;k++) {
x = ((FunctionBlock)f_blks.elementAt(k)).getX();
y = ((FunctionBlock)f_blks.elementAt(k)).getY();
((FunctionBlock)f_blks.elementAt(k)).move (x + dx, y + dy);
}
n = sum_pts.size();
for(k=0;k<n;k++) {
x = ((SummingPoint)sum_pts.elementAt(k)).getX();
y = ((SummingPoint)sum_pts.elementAt(k)).getY();
((SummingPoint)sum_pts.elementAt(k)).move (x + dx, y + dy);
}
n = arcs.size();
for(k=0;k<n;k++) {
x = ((Arc)arcs.elementAt(k)).getX();
y = ((Arc)arcs.elementAt(k)).getY();
((Arc)arcs.elementAt(k)).move (x + dx, y + dy);
}
}
//public int getFBw() {
// int k,n ;
// n = f_blks.size();
// for(k=0;k<n;k++) {
// x = ((FunctionBlock)f_blks.elementAt(k)).getX();
// y = ((FunctionBlock)f_blks.elementAt(k)).getY();
//((FunctionBlock)f_blks.elementAt(k)).move (x + dx, y + dy);
// return
// }
//k = f_blks.lastIndexOf(fb);
//return ((FunctionBlock)f_blks.elementAt(k)).getW();
// }
public void addSummingPoint( SummingPoint s ) {
sum_pts.addElement( s );
}
public void addFunctionBlock( FunctionBlock fb ) {
f_blks.addElement( fb );
}
public void addArc( Arc a ) {
arcs.addElement( a );
}
public void setInput ( IOPoint io ) {
input = io;
}
public void setOutput ( IOPoint io ) {
output = io;
}
public int getX() { return x; }
public int getY() { return y; }
public void draw( Graphics g ) {
int k, n;
// g.drawString( label, lx, ly );
n = arcs.size();
for(k=0;k<n;k++) {
((Arc)arcs.elementAt(k)).draw( g );
}
input.draw( g );
output.draw( g );
n = f_blks.size();
for(k=0;k<n;k++) {
((FunctionBlock)f_blks.elementAt(k)).draw( g );
}
n = sum_pts.size();
for(k=0;k<n;k++) {
((SummingPoint)sum_pts.elementAt(k)).draw( g );
}
}
public Dimension getLimit( int dirn ) {
return new Dimension( 0, 0 );
}
public void ConsTestCase() {
Arc a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11;
FunctionBlock g1, g2, g3, h1, h2;
SummingPoint sp1, sp2;
Node in_node, out_node, g1_node, g2_node, g3_node, h1_node, h2_node, sp1_node, sp2_node;
int Sx, Sy, gap;
Sx = 100;
Sy = 150;
gap = 100;
setInput( new IOPoint("R", "s", Sx, Sy, 50, 30, true ) );
in_node = new Node(input, Node.IOtype);
setOutput( new IOPoint("Y", "s", Sx + 6*gap, Sy, 50, 30, false ) );
out_node = new Node(output, Node.IOtype);
// Summing Points
addSummingPoint( sp1 = new SummingPoint( Sx + gap, Sy ) );
sp1_node = new Node (sp1, Node.SPtype);
addSummingPoint( sp2 = new SummingPoint( Sx + 3*gap, Sy ) );
sp2_node = new Node (sp2, Node.SPtype);
// Function Blocks
g1 = new FunctionBlock("G", "1", Sx + 2*gap, Sy, 40, 30 );
addFunctionBlock( g1 );
g1_node = new Node( g1, Node.FBtype );
g2 = new FunctionBlock("G", "2", Sx + 4*gap, Sy, 40, 30 );
g2_node = new Node( g2, Node.FBtype );
addFunctionBlock( g2 );
g3 = new FunctionBlock("G", "3", Sx + 5*gap, Sy, 40, 30 );
g3_node = new Node( g3, Node.FBtype );
addFunctionBlock( g3 );
h1 = new FunctionBlock("H", "1", Sx + 3*gap, Sy + gap, 40, 30 );
addFunctionBlock( h1 );
h1_node = new Node( h1, Node.FBtype );
h2 = new FunctionBlock("H", "2", Sx + 4*gap, Sy - gap, 40, 30 );
addFunctionBlock( h2 );
h2_node = new Node( h2, Node.FBtype );
// Arcs
a1 = new Arc( 3, true, true, in_node,sp1_node);
a1.addPoint( Sx ,Sy );
a1.addPoint( Sx + gap, Sy );
addArc( a1 );
a2 = new Arc( 3, true, false, sp1_node, g1_node);
a2.addPoint( Sx + gap, Sy );
a2.addPoint( Sx + 2*gap, Sy );
addArc( a2 );
a3 = new Arc( 3, true, true, g1_node, sp2_node);
a3.addPoint( Sx + 2*gap,Sy );
a3.addPoint( Sx + 3*gap, Sy );
addArc( a3 );
a4 = new Arc( 3, true, false, sp2_node, g2_node);
a4.addPoint( Sx + 3*gap,Sy );
a4.addPoint( Sx + 4*gap, Sy );
addArc( a4 );
a5 = new Arc( 3, true, false, g2_node, g3_node );
a5.addPoint( Sx + 4*gap, Sy );
a5.addPoint( Sx + 5*gap, Sy);
addArc( a5 );
a6 = new Arc( 3, true, false, g3_node, out_node );
a6.addPoint( Sx + 5*gap, Sy );
a6.addPoint( Sx + 6*gap, Sy);
addArc( a6 );
a7 = new Arc( 3, false, false, g3_node, h1_node );
a7.addPoint( Sx + (6*gap - gap/2), Sy );
a7.addPoint(Sx + (6*gap - gap/2), Sy + gap);
a7.addPoint( Sx + 3*gap, Sy + gap );
addArc( a7 );
a8 = new Arc( 3, false, true, h1_node, sp1_node );
a8.addPoint( Sx + 3*gap,Sy + gap);
a8.addPoint(Sx + gap, Sy + gap);
a8.addPoint( Sx + gap, Sy );
addArc( a8 );
a9 = new Arc( 3, false, false, g2_node, h2_node );
a9.addPoint( Sx + (5*gap - gap/2) ,Sy);
a9.addPoint(Sx + (5*gap - gap/2), Sy - gap);
a9.addPoint( Sx + 4*gap, Sy - gap);
addArc( a9 );
a10 = new Arc( 3, true, true, h2_node, sp2_node );
a10.addPoint( Sx + 4*gap,Sy - gap);
a10.addPoint(Sx + 3*gap, Sy - gap);
a10.addPoint( Sx + 3*gap, Sy);
addArc( a10 );
}
private int tx, ty, tw, th;
private boolean getXYWH( String p ) {
System.out.println("getXYWH [" + p + "]" );
int ix = p.indexOf( "{" );
String p1 = p.substring( ix+1 );
StringTokenizer t = new StringTokenizer( p1, ",}" );
tx = Integer.valueOf(t.nextToken()).intValue();
ty = Integer.valueOf(t.nextToken()).intValue();
tw = Integer.valueOf(t.nextToken()).intValue();
th = Integer.valueOf(t.nextToken()).intValue();
System.out.println( "tx " + tx + " ty " + ty + " tw " + tw + " th " + th + "]");
return true;
}
private String s_label;
private String subs;
private String getQuoted( String x ) {
System.out.println("getQuoted [" + x + "]" );
String p1 = x.substring(1);
int index = p1.indexOf( "\"" );
System.out.println("getQuoted p1 [" + p1 + "] index " + index );
return p1.substring(0,index);
}
private boolean getSL( String p ) {
System.out.println("getSL [" + p + "]" );
String token;
StringTokenizer t = new StringTokenizer( p, "," );
String x = t.nextToken();
s_label = getQuoted( x );
x = t.nextToken();
subs = getQuoted( x );
return true;
}
private Node parseInput( String p ) {
Node in_node;
System.out.println("parseInput [" + p + "]" );
// Strip the leading brace
String p1 = p.substring( 1 );
StringTokenizer t = new StringTokenizer( p1, "}" );
String sl = t.nextToken();
if ( getSL( sl ) ) {
String x = t.nextToken();
System.out.println("x [" + x + "]" );
int comma = x.indexOf( "," );
String x1 = x.substring( comma+1 );
System.out.println("x1 [" + x1 + "]" );
if ( getXYWH( x1 ) ) {
setInput( new IOPoint( s_label, subs, tx, ty, tw, th, true ) );
System.out.println("Input [" + s_label + "," + subs + "]" );
in_node = new Node(input, Node.IOtype);
return in_node;
}
}
return null;
}
private void parseOutput( String p ) {
}
private void parseSP( String p ) {
}
private void parseFB( String p ) {
}
private void parseARC( String p ) {
}
public BlockDiagram( URL sourceURL ) {
InputStream source = null;
StringBuffer sb;
String file_name;
Node in_node, out_node;
int k;
String kw[] = { "Input", "Output", "SP", "FB", "ARC", "END" };
file_name = sourceURL.toString();
System.out.println("Read BD from " + file_name );
try {
source = sourceURL.openStream();
} catch( IOException e ) {
System.out.println("Read BD IOException on " + file_name );
}
if ( source != null ) {
/* Read the file */
DataInputStream ds = new DataInputStream( source );
k = 0;
try {
while( k != 5 ) {
String s;
if ( ( s = ds.readLine()) != null ) {
System.out.println("Line [" + s + "]" );
StringTokenizer t = new StringTokenizer( s, "=\n\r" );
String keyword = t.nextToken();
String params = t.nextToken();
System.out.println("key [" + keyword + "][" + params + "]" );
for(k=0;k<kw.length;k++) {
if ( keyword.equals( kw[k] ) ) break;
}
// Strip the leading and trailing { }
String p1 = params.substring( 1 );
// Strip the trailing one also!!
System.out.println( "BD(URL): k = " + k );
switch( k ) {
case 0: // Input
in_node = parseInput( p1 ); break;
case 1: // Output
parseOutput( params ); break;
case 2: // SP
parseSP( params ); break;
case 3: // FB
parseFB( params ); break;
case 4: // ARC
parseARC( params ); break;
case 5: // END
System.out.println("BD(URL): END found"); break;
default:
System.out.println("BD(URL): unknown keyword");
break;
}
}
else break;
}
} catch( IOException e ) {
System.out.println("Read BD IOEx reading");
}
System.out.println("BD(URL): file read");
}
else {
System.out.println("Null source");
}
}
public BlockDiagram( int transform_case ) {
Arc a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11;
FunctionBlock g1, g2, g3, h1, h2;
SummingPoint sp1, sp2;
Node in_node, out_node, g1_node, g2_node, g3_node, h1_node, h2_node, sp1_node, sp2_node;
int Sx, Sy, gap, Bw , Bh;
Sx = 100;
Sy = 250;
gap = 100;
Bw = 40;
Bh = 30;
if (transform_case == 1) {
setInput( new IOPoint("R", "s", Sx, Sy, Bw, Bh, true ) );
in_node = new Node(input, Node.IOtype);
setOutput( new IOPoint("Y", "s", Sx + 3*gap, Sy, Bw, Bh, false ) );
out_node = new Node(output, Node.IOtype);
g1 = new FunctionBlock("G", "1", Sx + gap, Sy, Bw, Bh );
addFunctionBlock( g1 );
g1_node = new Node( g1, Node.FBtype );
g2 = new FunctionBlock("G", "2", Sx + 2*gap, Sy, Bw, Bh );
g2_node = new Node( g2, Node.FBtype );
addFunctionBlock( g2 );
a1 = new Arc( 3, true, false, in_node,g1_node);
a1.addPoint( Sx ,Sy );
a1.addPoint( Sx + gap, Sy );
addArc( a1 );
a2 = new Arc( 3, true, false, g1_node, g2_node);
a2.addPoint( Sx + gap, Sy );
a2.addPoint( Sx + 2*gap, Sy );
addArc( a2 );
a3 = new Arc( 3, true, true, g2_node, out_node);
a3.addPoint( Sx + 2*gap,Sy );
a3.addPoint( Sx + 3*gap, Sy );
addArc( a3 ); }
}
public BlockDiagram( int tf_no, boolean before ) {
// Code to build the "standard" transforms
Arc a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11;
FunctionBlock g1, g2, g3, h1, h2, y2, r2;
SummingPoint sp1, sp2;
Node in_node, out_node, y2_node, r2_node, g1_node, g2_node, g3_node, h1_node, h2_node, sp1_node, sp2_node;
int Sx, Sy, gap, Bw , Bh;
System.out.println("BlockDiagram cons(" + tf_no + "," + before + ")" );
Sx = 30;
Sy = 30;
gap = 70;
Bw = 30;
Bh = 20;
this.label = new String( "TF" + tf_no );
input = output = null;
sum_pts = new Vector( 10 );
f_blks = new Vector( 10 );
arcs = new Vector( 10 );
x = y = 0;
if ( before ) {
switch( ++tf_no ) {
case 1:
setInput( new IOPoint("R", "s", Sx, Sy, Bw, Bh, true ) );
in_node = new Node(input, Node.IOtype);
setOutput( new IOPoint("Y", "s", Sx + 3*gap, Sy, Bw, Bh, false ) );
out_node = new Node(output, Node.IOtype);
g1 = new FunctionBlock("G", "1", Sx + gap, Sy, Bw, Bh );
if ( g1 == null ) {
System.out.println( "BD cons(" + tf_no + "," + before + ") cant create FB");
}
addFunctionBlock( g1 );
g1_node = new Node( g1, Node.FBtype );
g2 = new FunctionBlock("G", "2", Sx + 2*gap, Sy, Bw, Bh );
g2_node = new Node( g2, Node.FBtype );
addFunctionBlock( g2 );
a1 = new Arc( 3, true, false, in_node,g1_node);
a1.addPoint( Sx ,Sy );
a1.addPoint( Sx + gap, Sy );
addArc( a1 );
a2 = new Arc( 3, true, false, g1_node, g2_node);
a2.addPoint( Sx + gap, Sy );
a2.addPoint( Sx + 2*gap, Sy );
addArc( a2 );
a3 = new Arc( 3, true, false, g2_node, out_node);
a3.addPoint( Sx + 2*gap,Sy );
a3.addPoint( Sx + 3*gap, Sy );
addArc( a3 );
break;
case 2:
setInput( new IOPoint("R", "s", Sx, Sy, Bw, Bh, true ) );
in_node = new Node(input, Node.IOtype);
setOutput( new IOPoint("Y1", "s", Sx + 3*gap, Sy, Bw, Bh, false ) );
out_node = new Node(output, Node.IOtype);
addSummingPoint( sp1 = new SummingPoint( Sx + gap, Sy ) );
sp1_node = new Node (sp1, Node.SPtype);
g1= new FunctionBlock("G", "1", Sx + 2*gap, Sy, Bw, Bh );
g1_node = new Node( g1, Node.FBtype );
addFunctionBlock( g1 );
y2 = new FunctionBlock("Y2", "s", Sx + 2*gap, Sy+gap/2, Bw, Bh );
y2_node = new Node( y2, Node.FBtype );
addFunctionBlock( y2 );
a1 = new Arc( 3, true, true, in_node,sp1_node);
a1.addPoint( Sx ,Sy );
a1.addPoint( Sx + gap, Sy );
addArc( a1 );
a2 = new Arc( 3, true, false, sp1_node, g1_node);
a2.addPoint( Sx + gap, Sy );
a2.addPoint( Sx + 2*gap, Sy );
addArc( a2 );
a3 = new Arc( 3, true, false, g1_node, out_node);
a3.addPoint( Sx + 2*gap, Sy );
a3.addPoint( Sx + 3*gap, Sy );
addArc( a3 );
a4 = new Arc( 3, true, false, y2_node, sp1_node);
a4.addPoint( Sx + 2*gap, Sy+gap/2 );
a4.addPoint( Sx + gap, Sy+gap/2 );
a4.addPoint( Sx + gap, Sy );
addArc( a4 );
break;
case 3:
setInput( new IOPoint("R", "s", Sx, Sy, Bw, Bh, true ) );
in_node = new Node(input, Node.IOtype);
setOutput( new IOPoint("Y", "s", Sx + 3*gap, Sy, Bw, Bh, false ) );
out_node = new Node(output, Node.IOtype);
g1 = new FunctionBlock("G", "1", Sx + gap, Sy, Bw, Bh );
g1_node = new Node( g1, Node.FBtype );
addFunctionBlock( g1 );
y2 = new FunctionBlock("Y", "s", Sx + gap, Sy+gap/2, Bw, Bh );
y2_node = new Node( y2, Node.FBtype );
addFunctionBlock( y2 );
a1 = new Arc( 3, true, false, in_node,g1_node);
a1.addPoint( Sx ,Sy );
a1.addPoint( Sx + gap, Sy );
addArc( a1 );
a2 = new Arc( 3, true, false, g1_node, out_node);
a2.addPoint( Sx + gap, Sy );
a2.addPoint( Sx + 3*gap, Sy );
addArc( a2 );
a3 = new Arc( 3, true, false, g1_node, y2_node);
a3.addPoint( Sx + 2*gap, Sy );
a3.addPoint( Sx + 2*gap, Sy+gap/2 );
a3.addPoint( Sx + gap, Sy+gap/2 );
addArc( a3 );
break;
case 4:
setInput( new IOPoint("R", "s", Sx, Sy, Bw, Bh, true ) );
in_node = new Node(input, Node.IOtype);
setOutput( new IOPoint("Y", "s", Sx + 3*gap, Sy, Bw, Bh, false ) );
out_node = new Node(output, Node.IOtype);
g1 = new FunctionBlock("G", "1", Sx + 2*gap, Sy, Bw, Bh );
g1_node = new Node( g1, Node.FBtype );
addFunctionBlock( g1 );
r2 = new FunctionBlock("R", "s", Sx , Sy+gap/2, Bw, Bh );
r2_node = new Node( r2, Node.FBtype );
addFunctionBlock( r2 );
a1 = new Arc( 3, true, false, in_node,g1_node);
a1.addPoint( Sx ,Sy );
a1.addPoint( Sx + 2*gap, Sy );
addArc( a1 );
a2 = new Arc( 3, true, false, g1_node, out_node);
a2.addPoint( Sx + 2*gap, Sy );
a2.addPoint( Sx + 3*gap, Sy );
addArc( a2 );
a3 = new Arc( 3, true, false, in_node, r2_node);
a3.addPoint( Sx + gap, Sy );
a3.addPoint( Sx + gap, Sy+gap/2 );
a3.addPoint( Sx, Sy+gap/2 );
addArc( a3 );
break;
case 5:
setInput( new IOPoint("R1", "s", Sx, Sy, Bw, Bh, true ) );
in_node = new Node(input, Node.IOtype);
setOutput( new IOPoint("Y", "s", Sx + 3*gap, Sy, Bw, Bh, false ) );
out_node = new Node(output, Node.IOtype);
addSummingPoint( sp1 = new SummingPoint( Sx + 2*gap, Sy ) );
sp1_node = new Node (sp1, Node.SPtype);
g1 = new FunctionBlock("G", "1", Sx + gap, Sy, Bw, Bh );
g1_node = new Node( g1, Node.FBtype );
addFunctionBlock( g1 );
r2 = new FunctionBlock("R2", "s", Sx + gap , Sy+gap/2, Bw, Bh );
r2_node = new Node( r2, Node.FBtype );
addFunctionBlock( r2 );
a1 = new Arc( 3, true, false, in_node,g1_node);
a1.addPoint( Sx ,Sy );
a1.addPoint( Sx + gap, Sy );
addArc( a1 );
a2 = new Arc( 3, true, true, g1_node, sp1_node);
a2.addPoint( Sx + gap, Sy );
a2.addPoint( Sx + 2*gap, Sy );
addArc( a2 );
a3 = new Arc( 3, true, false, sp1_node, out_node);
a3.addPoint( Sx + 2*gap, Sy );
a3.addPoint( Sx + 3*gap, Sy );
addArc( a3 );
a4 = new Arc( 3, true, true, r2_node, sp1_node);
a4.addPoint( Sx + gap, Sy + gap/2 );
a4.addPoint( Sx + 2*gap, Sy + gap/2 );
a4.addPoint( Sx + 2*gap, Sy);
addArc( a4 );
break;
case 6:
setInput( new IOPoint("R", "s", Sx, Sy, Bw, Bh, true ) );
in_node = new Node(input, Node.IOtype);
setOutput( new IOPoint("Y", "s", Sx + 3*gap, Sy, Bw, Bh, false ) );
out_node = new Node(output, Node.IOtype);
addSummingPoint( sp1 = new SummingPoint( Sx + gap, Sy ) );
sp1_node = new Node (sp1, Node.SPtype);
g1 = new FunctionBlock("G", "1", Sx + 2*gap, Sy, Bw, Bh );
g1_node = new Node( g1, Node.FBtype );
addFunctionBlock( g1 );
h1 = new FunctionBlock("H", "1", Sx + 2*gap , Sy+gap/2, Bw, Bh );
h1_node = new Node( h1, Node.FBtype );
addFunctionBlock( h1 );
a1 = new Arc( 3, true, true, in_node,sp1_node);
a1.addPoint( Sx ,Sy );
a1.addPoint( Sx + gap, Sy );
addArc( a1 );
a2 = new Arc( 3, true, false, sp1_node, g1_node);
a2.addPoint( Sx + gap, Sy );
a2.addPoint( Sx + 2*gap, Sy );
addArc( a2 );
a3 = new Arc( 3, true, false, g1_node, out_node);
a3.addPoint( Sx + 2*gap, Sy );
a3.addPoint( Sx + 3*gap, Sy );
addArc( a3 );
a4 = new Arc( 3, true, false, g1_node, h1_node);
a4.addPoint( Sx + (2*gap)+(gap/2), Sy );
a4.addPoint( Sx + (2*gap)+(gap/2), Sy + gap/2 );
a4.addPoint( Sx + 2*gap, Sy + gap/2);
addArc( a4 );
a5 = new Arc( 3, true, true, h1_node, sp1_node);
a5.addPoint( Sx + 2*gap, Sy + gap/2 );
a5.addPoint( Sx + gap, Sy + gap/2);
a5.addPoint( Sx + gap, Sy);
addArc( a5 );
break;
case 7:
setInput( new IOPoint("", "", Sx+gap, Sy, 0, 0, true ) );
in_node = new Node(input, Node.IOtype);
setOutput( new IOPoint("", "", Sx + 2*gap, Sy, 0, 0, false ) );
out_node = new Node(output, Node.IOtype);
a1 = new Arc( 100, true, false, in_node,out_node);
a1.setColour(Color.black);
a1.addPoint( Sx +gap,Sy );
a1.addPoint( Sx + 2*gap, Sy );
addArc( a1 ); }
}
else{
switch(++ tf_no ) {
case 1:
setInput( new IOPoint("R", "s", Sx, Sy, Bw, Bh, true ) );
in_node = new Node(input, Node.IOtype);
setOutput( new IOPoint("Y", "s", Sx + 3*gap, Sy, Bw, Bh, false ) );
out_node = new Node(output, Node.IOtype);
g1 = new FunctionBlock("G1G2", "", Sx + gap + gap/2, Sy, Bw*2, Bh );
if ( g1 == null ) {
System.out.println( "BD cons(" + tf_no + "," + before + ") cant create FB");
}
addFunctionBlock( g1 );
g1_node = new Node( g1, Node.FBtype );
a1 = new Arc( 3, true, false, in_node,g1_node);
a1.addPoint( Sx ,Sy );
a1.addPoint( Sx + gap + gap/2, Sy );
addArc( a1 );
a2 = new Arc( 3, true, false, g1_node, out_node);
a2.addPoint( Sx + gap + gap/2, Sy );
a2.addPoint( Sx + 3*gap, Sy );
addArc( a2 );
break;
case 2:
setInput( new IOPoint("R", "s", Sx, Sy, Bw, Bh, true ) );
in_node = new Node(input, Node.IOtype);
setOutput( new IOPoint("Y1", "s", Sx + 3*gap, Sy, Bw, Bh, false ) );
out_node = new Node(output, Node.IOtype);
addSummingPoint( sp1 = new SummingPoint( Sx + 2*gap, Sy ) );
sp1_node = new Node (sp1, Node.SPtype);
g1= new FunctionBlock("G", "1", Sx + gap, Sy, Bw, Bh );
g1_node = new Node( g1, Node.FBtype );
addFunctionBlock( g1 );
g2= new FunctionBlock("G", "2", Sx + 2*gap, Sy+2*gap/3, Bw, Bh );
g2_node = new Node( g2, Node.FBtype );
addFunctionBlock( g2 );
y2 = new FunctionBlock("Y2", "s", Sx + 3*gap, Sy+2*gap/3, Bw, Bh );
y2_node = new Node( y2, Node.FBtype );
addFunctionBlock( y2 );
a1 = new Arc( 3, true, false, in_node,g1_node);
a1.addPoint( Sx ,Sy );
a1.addPoint( Sx + gap, Sy );
addArc( a1 );
a2 = new Arc( 3, true, true, g1_node, sp1_node);
a2.addPoint( Sx + gap, Sy );
a2.addPoint( Sx + 2*gap, Sy );
addArc( a2 );
a3 = new Arc( 3, true, false, sp1_node, out_node);
a3.addPoint( Sx + 2*gap, Sy );
a3.addPoint( Sx + 3*gap, Sy );
addArc( a3 );
a4 = new Arc( 3, true, false, y2_node, g2_node);
a4.addPoint( Sx + 3*gap, Sy+2*gap/3 );
a4.addPoint( Sx + 2*gap, Sy+2*gap/3 );
addArc( a4 );
a5 = new Arc( 3, true, true, g2_node, sp1_node);
a5.addPoint( Sx + 2*gap, Sy+2*gap/3 );
a5.addPoint( Sx + 2*gap, Sy );
addArc( a5 );
break;
case 3:
setInput( new IOPoint("R", "s", Sx, Sy, Bw, Bh, true ) );
in_node = new Node(input, Node.IOtype);
setOutput( new IOPoint("Y", "s", Sx + 3*gap, Sy, Bw, Bh, false ) );
out_node = new Node(output, Node.IOtype);
g1 = new FunctionBlock("G", "1", Sx + 2*gap, Sy, Bw, Bh );
g1_node = new Node( g1, Node.FBtype );
addFunctionBlock( g1 );
g2 = new FunctionBlock("G", "1", Sx + gap, Sy + 2*gap/3, Bw, Bh );
g2_node = new Node( g2, Node.FBtype );
addFunctionBlock( g2 );
y2 = new FunctionBlock("Y", "s", Sx, Sy+2*gap/3, Bw, Bh );
y2_node = new Node( y2, Node.FBtype );
addFunctionBlock( y2 );
a1 = new Arc( 3, true, false, in_node,g1_node);
a1.addPoint( Sx ,Sy );
a1.addPoint( Sx + 2*gap, Sy );
addArc( a1 );
a2 = new Arc( 3, true, false, g1_node, out_node);
a2.addPoint( Sx + 2*gap, Sy );
a2.addPoint( Sx + 3*gap, Sy );
addArc( a2 );
a3 = new Arc( 3, true, false, in_node, g2_node);
a3.addPoint( Sx + gap, Sy );
a3.addPoint( Sx + gap, Sy+2*gap/3 );
addArc( a3 );
a4 = new Arc( 3, true, false, g2_node, y2_node);
a4.addPoint( Sx + gap, Sy+2*gap/3);
a4.addPoint( Sx , Sy+2*gap/3 );
addArc( a4 );
break;
case 4:
setInput( new IOPoint("R", "s", Sx, Sy, Bw, Bh, true ) );
in_node = new Node(input, Node.IOtype);
setOutput( new IOPoint("Y", "s", Sx + 3*gap, Sy, Bw, Bh, false ) );
out_node = new Node(output, Node.IOtype);
g1 = new FunctionBlock("G", "1", Sx + 2*gap, Sy, Bw, Bh );
g1_node = new Node( g1, Node.FBtype );
addFunctionBlock( g1 );
g2 = new FunctionBlock("1/G", "", Sx + 2*gap, Sy+gap/2, Bw, Bh );
g2_node = new Node( g2, Node.FBtype );
addFunctionBlock( g2 );
r2 = new FunctionBlock("R", "s", Sx + gap , Sy+gap/2, Bw, Bh );
r2_node = new Node( r2, Node.FBtype );
addFunctionBlock( r2 );
a1 = new Arc( 3, true, false, in_node,g1_node);
a1.addPoint( Sx ,Sy );
a1.addPoint( Sx + 2*gap, Sy );
addArc( a1 );
a2 = new Arc( 3, true, false, g1_node, out_node);
a2.addPoint( Sx + 2*gap, Sy );
a2.addPoint( Sx + 3*gap, Sy );
addArc( a2 );
a3 = new Arc( 3, true, false, g1_node, g2_node);
a3.addPoint( Sx + 5*gap/2, Sy );
a3.addPoint( Sx + 5*gap/2, Sy+gap/2 );
a3.addPoint( Sx + 2*gap, Sy+gap/2 );
addArc( a3 );
a4 = new Arc( 3, true, false, g2_node, r2_node);
a4.addPoint( Sx + 2*gap, Sy+gap/2 );
a4.addPoint( Sx + gap, Sy+gap/2 );
addArc( a4 );
break;
case 5:
setInput( new IOPoint("R1", "s", Sx, Sy, Bw, Bh, true ) );
in_node = new Node(input, Node.IOtype);
setOutput( new IOPoint("Y", "s", Sx + 3*gap, Sy, Bw, Bh, false ) );
out_node = new Node(output, Node.IOtype);
addSummingPoint( sp1 = new SummingPoint( Sx + gap, Sy ) );
sp1_node = new Node (sp1, Node.SPtype);
g1 = new FunctionBlock("G", "1", Sx + 2*gap, Sy, Bw, Bh );
g1_node = new Node( g1, Node.FBtype );
addFunctionBlock( g1 );
g2 = new FunctionBlock("1/G", "", Sx + 2*gap, Sy+gap/2, Bw, Bh );
g2_node = new Node( g2, Node.FBtype );
addFunctionBlock( g2 );
r2 = new FunctionBlock("R2", "s", Sx + 3*gap , Sy+gap/2, Bw, Bh );
r2_node = new Node( r2, Node.FBtype );
addFunctionBlock( r2 );
a1 = new Arc( 3, true, true, in_node,sp1_node);
a1.addPoint( Sx ,Sy );
a1.addPoint( Sx + gap, Sy );
addArc( a1 );
a2 = new Arc( 3, true, false, sp1_node, g1_node);
a2.addPoint( Sx + gap, Sy );
a2.addPoint( Sx + 2*gap, Sy );
addArc( a2 );
a3 = new Arc( 3, true, false, g1_node, out_node);
a3.addPoint( Sx + 2*gap, Sy );
a3.addPoint( Sx + 3*gap, Sy );
addArc( a3 );
a4 = new Arc( 3, true, false, r2_node, g2_node);
a4.addPoint( Sx + 3*gap, Sy + gap/2 );
a4.addPoint( Sx + 2*gap, Sy + gap/2 );
addArc( a4 );
a5 = new Arc( 3, true, true, g2_node, sp1_node);
a5.addPoint( Sx + 2*gap, Sy + gap/2 );
a5.addPoint( Sx + gap, Sy + gap/2 );
a5.addPoint( Sx + gap, Sy );
addArc( a5 );
break;
case 6:
setInput( new IOPoint("R", "s", Sx, Sy, Bw, Bh, true ) );
in_node = new Node(input, Node.IOtype);
setOutput( new IOPoint("Y", "s", Sx + 3*gap, Sy, Bw, Bh, false ) );
out_node = new Node(output, Node.IOtype);
g1 = new FunctionBlock("G1/1+(G1H1)", "", Sx + 3*gap/2, Sy, Bw*3, Bh );
if ( g1 == null ) {
System.out.println( "BD cons(" + tf_no + "," + before + ") cant create FB");
}
addFunctionBlock( g1 );
g1_node = new Node( g1, Node.FBtype );
a1 = new Arc( 3, true, false, in_node,g1_node);
a1.addPoint( Sx ,Sy );
a1.addPoint( Sx + 3*gap/2, Sy );
addArc( a1 );
a2 = new Arc( 3, true, false, g1_node, out_node);
a2.addPoint( Sx + 3*gap/2, Sy );
a2.addPoint( Sx + 3*gap, Sy );
addArc( a2 );
break;
}
}
}
}