This is Gate.m in view mode; [Download] [Up]
// // Gate // // An Objective-C class for simulating digital logic which // simulates a generic n-input, m-bit gate. // #import "Gate.h" @implementation Gate - initNumBits:(int)nbits in:innode out:outnode { [super init]; INITDEVTYPE("Gate"); if(nbits < 1) { fprintf(stderr, "Gate: Attempt to create Gate with %d bits per input!\n", nbits); exit(-1); } numbits = nbits; multiinput = NO; TESTNODE("IN", innode, numbits); TESTNODE("OUT", outnode, 1); IN = innode; OUT = outnode; return self; } - initNumInputs:(int)n inputs:(id *)inparray numBits:(int)nbits out:outnode { int i; char nodenum[20]; [super init]; multiinput = YES; if(n < 2) { fprintf(stderr, "Gate: Attempt to create multi-input Gate with %d inputs!\n", n); exit(-1); } if(nbits < 1) { fprintf(stderr, "Gate: Attempt to create Gate with %d bits per input!\n", nbits); exit(-1); } numinputs = n; numbits = nbits; inputs = (id *)malloc(numinputs * sizeof(id)); INITDEVTYPE("Gate"); for(i = 0; i < numinputs; i++) { sprintf(nodenum, "IN[%d]", i); TESTNODE(nodenum, inparray[i], numbits); inputs[i] = inparray[i]; } TESTNODE("OUT", outnode, numbits); OUT = outnode; temp = (bit *)malloc(numbits * sizeof(bit)); // Temporary answer storage. if(temp == NULL) { fprintf(stderr, "Gate: Unable to allocate temporary storage!\n"); exit(-1); } return self; } - free { if(!multiinput) { } else { free(inputs); free(temp); } return [super free]; } - (bit)op:(bit)a :(bit)b { fprintf(stderr, "Gate: Warning! Call to Gate's op:: method probably shouldn't occur!\n"); return 0; // Default gate zeros. } - cycle { int i, j; bit *inp; if(!multiinput) { // If single input: inp = [IN getBits]; tempbit = inp[0]; for(i = 1; i < numbits; i++) { tempbit = [self op:tempbit :inp[i]]; // Perform bit operation. } [OUT setBits:&tempbit]; // Copy answer to output node. } else { inp = [inputs[0] getBits]; for(i = 0; i < numbits; i++) // Initialize answer. temp[i] = inp[i]; for(j = 1; j < numinputs; j++) { inp = [inputs[j] getBits]; // Get an input's bits. for(i = 0; i < numbits; i++) { temp[i] = [self op:temp[i] :inp[i]]; // Perform operation on bits. } } [OUT setBits:temp]; // Copy answer to output node. } 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.