00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "recSchema.h"
00024 #include <iostream>
00025 #include <assert.h>
00026
00027 using namespace std;
00028
00034 schema* makeRecSchema (schema* s1, schema* s2)
00035 {
00036 schema* a = makeEnlargedSchema(s1, s2->width());
00037 schema* b = makeEnlargedSchema(s2, s1->width());
00038 double m = dWire * max(b->inputs(), b->outputs());
00039 double w = a->width() + 2*m;
00040
00041 return new recSchema(a,b,w);
00042 }
00043
00048 recSchema::recSchema (schema* s1, schema* s2, double width)
00049 : schema( s1->inputs() - s2->outputs(),
00050 s1->outputs(),
00051 width,
00052 s1->height() + s2->height() ),
00053 fSchema1(s1),
00054 fSchema2(s2)
00055 {
00056
00057 assert(s1->inputs() >= s2->outputs());
00058 assert(s1->outputs() >= s2->inputs());
00059 assert(s1->width() >= s2->width());
00060
00061
00062 for (unsigned int i=0; i<inputs(); i++) fInputPoint.push_back(point(0));
00063 for (unsigned int i=0; i<outputs(); i++) fOutputPoint.push_back(point(0));
00064
00065 }
00066
00071 void recSchema::place(double ox, double oy, int orientation)
00072 {
00073 beginPlace(ox, oy, orientation);
00074
00075 double dx1 = (width() - fSchema1->width())/2;
00076 double dx2 = (width() - fSchema2->width())/2;
00077
00078
00079 if (orientation == kLeftRight) {
00080 fSchema2->place(ox+dx2, oy, kRightLeft);
00081 fSchema1->place(ox+dx1, oy+fSchema2->height(), kLeftRight);
00082 } else {
00083 fSchema1->place(ox+dx1, oy, kRightLeft);
00084 fSchema2->place(ox+dx2, oy+fSchema1->height(), kLeftRight);
00085 }
00086
00087
00088
00089 if (orientation == kRightLeft) { dx1 = -dx1; }
00090
00091
00092 for (unsigned int i=0; i<inputs(); i++) {
00093 point p = fSchema1->inputPoint(i+fSchema2->outputs());
00094 fInputPoint[i] = point(p.x-dx1, p.y);
00095 }
00096
00097
00098 for (unsigned int i=0; i<outputs(); i++) {
00099 point p = fSchema1->outputPoint(i);
00100 fOutputPoint[i] = point(p.x+dx1, p.y);
00101 }
00102
00103 endPlace();
00104 }
00105
00106
00110 point recSchema::inputPoint(unsigned int i)
00111 {
00112 return fInputPoint[i];
00113 }
00114
00115
00119 point recSchema::outputPoint(unsigned int i)
00120 {
00121 return fOutputPoint[i];
00122 }
00123
00124
00130 void recSchema::draw(device& dev)
00131 {
00132 assert(placed());
00133
00134
00135 fSchema1->draw(dev);
00136 fSchema2->draw(dev);
00137
00138
00139 for (unsigned int i=0; i<outputs(); i++) {
00140 point p = fSchema1->outputPoint(i);
00141 point q = outputPoint(i);
00142 dev.trait(p.x, p.y, q.x, q.y);
00143 }
00144
00145
00146 unsigned int skip = fSchema2->outputs();
00147 for (unsigned int i=0; i<inputs(); i++) {
00148 point p = fSchema1->inputPoint(i+skip);
00149 point q = inputPoint(i);
00150 dev.trait(p.x, p.y, q.x, q.y);
00151 }
00152
00153
00154 for (unsigned int i=0; i<fSchema2->inputs(); i++) {
00155 drawFeedback(dev, fSchema1->outputPoint(i), fSchema2->inputPoint(i), i*dWire);
00156 }
00157
00158
00159 for (unsigned int i=0; i<fSchema2->outputs(); i++) {
00160 drawFeedfront(dev, fSchema2->outputPoint(i), fSchema1->inputPoint(i), i*dWire);
00161 }
00162 }
00163
00164
00165
00170 void recSchema::drawFeedback(device& dev, const point& src, const point& dst, double dx)
00171 {
00172 double ox = src.x + ((orientation()==kLeftRight) ? dx : -dx);
00173 double ct = (orientation()==kLeftRight) ? dWire/2 : -dWire/2;
00174
00175 drawDelaySign(dev, ox, src.y, ct);
00176 dev.trait(ox, src.y-ct, ox, dst.y);
00177 dev.trait(ox, dst.y, dst.x, dst.y);
00178 }
00179
00180
00184 void recSchema::drawDelaySign(device& dev, double x, double y, double size)
00185 {
00186 dev.trait(x-size/2, y, x-size/2, y-size);
00187 dev.trait(x-size/2, y-size, x+size/2, y-size);
00188 dev.trait(x+size/2, y-size, x+size/2, y);
00189 }
00190
00191
00196 void recSchema::drawFeedfront(device& dev, const point& src, const point& dst, double dx)
00197 {
00198 double ox = src.x + ((orientation()==kLeftRight) ? -dx : dx);
00199
00200 dev.trait(ox, src.y, src.x, src.y);
00201 dev.trait(ox, src.y, ox, dst.y);
00202 dev.trait(ox, dst.y, dst.x, dst.y);
00203 }