This is Splitter.m in view mode; [Download] [Up]
//
// Splitter
//
// Splits off set of bits from input node.
//
// A Splitter is a subclass of Node because it behaves just
// like a node except that it gets cycled (to update its value).
//
// When designing with Splitters, one should treat them like a Node
// for connections (i.e. they can be passed in as Node parameters,
// but ONLY as inputs to a device), and like a device for simulation
// (i.e. they need to be cycled before any devices which use their
// values).
//
// A splitter uses its Node data instance variable to hold the bits
// it splits from its IN Node. Of course, in most cases, this means
// that not all of that space will be used (i.e. usually Splitters
// are NOT used to replicate all the bits of the source--except the
// case where you might want to reverse the bits of another Node).
//
#import "Splitter.h"
@implementation Splitter
- initNumBits:(int)nbits // Number of input bits.
in:innode // Node from which to split.
start:(int)startbit // Bit 0 in split out.
stop:(int)stopbit // Bit n in split out.
{
if((startbit < 0) || (stopbit < 0)) {
fprintf(stderr, "Splitter: Neither the start nor the stop bit numbers may be less than zero!\n");
exit(-1);
}
start = startbit;
stop = stopbit;
if(start < stop) {
numbits = stop - start + 1;
}
else {
numbits = start - stop + 1;
}
[super initNumBits:numbits]; // Perform Node method.
inbits = nbits;
INITDEVTYPE("Splitter");
TESTNODE("IN", innode, inbits);
IN = innode;
return self;
}
- cycle
{
int i;
bit *inbitarray = [IN getBits];
for(i = 0; i < numbits; i++) {
if(start < stop) {
data[i] = inbitarray[start + i];
}
else {
data[i] = inbitarray[start - i];
}
}
return self;
}
@end
//
// End of file.
//These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.