This is Decoder.m in view mode; [Download] [Up]
//
// Decoder
//
// An Objective-C class for simulating a digital decoder.
//
#import "Decoder.h"
#import "compmath.h"
@implementation Decoder
- initNumBits:(int)nbits // numbits inputs, 2^numbits outputs.
in:innode // Input Node.
out:outnode // Node of outputs.
{
[super init];
if(nbits < 1) {
fprintf(stderr, "Decoder: Attempt to create Decoder with less than 1 input bit!\n");
exit(-2);
}
multioutput = NO; // Single output.
numbits = nbits;
numouts = pow2(numbits);
INITDEVTYPE("Decoder");
TESTNODE("IN", innode, numbits);
TESTNODE("OUT", outnode, numouts);
IN = innode;
OUT = outnode;
temp = (bit *)malloc(numouts * sizeof(bit));
return self;
}
- initNumBits:(int)nbits
in:innode
outs:(id *)outarray
{
int i;
char nodenum[20];
[super init];
multioutput = YES;
if(nbits < 1) {
fprintf(stderr, "Decoder: Attempt to create Decoder with %d inputs!\n", nbits);
exit(-1);
}
numbits = nbits;
numouts = pow2(numbits);
INITDEVTYPE("Decoder");
TESTNODE("IN", innode, numbits);
IN = innode;
outputs = (id *)malloc(numouts * sizeof(id));
for(i = 0; i < numouts; i++) {
sprintf(nodenum, "OUT[%d]", i);
TESTNODE(nodenum, outarray[i], 1);
outputs[i] = outarray[i];
}
temp = (bit *)malloc(numbits * sizeof(bit)); // Temporary answer storage.
return self;
}
- free
{
if(!multioutput) {
free(temp);
}
else {
free(outputs);
}
return [super free];
}
- cycle
{
int index, i;
bit tempbit;
bit *inbits = [IN getBits];
index = 0;
for(i = 0; i < numbits; i++) { // Calculate index of high output:
index = index * 2; // * Shift index right; and
index = index + inbits[i]; // * Add current bit.
}
if(!multioutput) {
for(i = 0; i < numouts; i++) {
temp[i] = (i == index); // Set all but index = 0.
}
[OUT setBits:temp];
}
else {
for(i = 0; i < numouts; i++) {
tempbit = (i == index);
[outputs[i] setBits:&tempbit];
}
}
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.