This is IndexRegister.m in view mode; [Download] [Up]
//
// IndexRegister
//
// An Objective-C class for a register with the ability to load,
// increment and decrement.
//
// Operation: LOAD loads the register from the input, INC increments the
// current register value and DEC decrements the current value. These
// operations are exclusive, but the logic doesn't handle this (if more
// than one of LOAD, INC or DEC is high, then the operation is undefined).
// the register asserts its output on OUT.
//
#import "IndexRegister.h"
@implementation IndexRegister
- initNumBits:(int)nbits
load:loadnode // Node with LOAD signal.
inc:incnode // Node with INCREMENT signal.
dec:decnode // Node with DECREMENT signal.
in:innode // Node giving input.
out:outnode // Node accepting output.
{
id sel_low_inputs[2];
id sel_high_inputs[2];
id mux_sources[4];
[super init];
numbits = nbits; // Remember number of bits.
INITDEVTYPE("IndexRegister");
TESTNODE("LOAD", loadnode, 1); // Make sure the nodes have the right
TESTNODE("INC", incnode, 1); // number of bits.
TESTNODE("DEC", decnode, 1);
TESTNODE("IN", innode, numbits);
TESTNODE("OUT", outnode, numbits);
LOAD = loadnode; // Remember our nodes for later.
INC = incnode;
DEC = decnode;
IN = innode;
OUT = outnode;
inc_out = [[Node alloc] initNumBits:numbits]; // Allocate glue Nodes.
dec_out = [[Node alloc] initNumBits:numbits];
mux_out = [[Node alloc] initNumBits:numbits];
sel_low_out = [[Node alloc] initNumBits:1];
sel_high_out = [[Node alloc] initNumBits:1];
reg_load = [[One alloc] initNumBits:1];
reg_inc = [[Incrementor alloc] initNumBits:numbits in:OUT out:inc_out];
reg_dec = [[Decrementor alloc] initNumBits:numbits in:OUT out:dec_out];
reg = [[Register alloc] initNumBits:numbits in:mux_out out:OUT load:reg_load];
sel_low_inputs[0] = LOAD;
sel_low_inputs[1] = DEC;
sel_low = [[ORGate alloc] initNumInputs:2 inputs:sel_low_inputs
numBits:1 out:sel_low_out];
sel_high_inputs[0] = DEC;
sel_high_inputs[1] = INC;
sel_high = [[ORGate alloc] initNumInputs:2 inputs:sel_high_inputs
numBits:1 out:sel_high_out];
merge_sel = [[Merger alloc] initLowBits:1 low:sel_low_out
highBits:1 high:sel_high_out];
mux_sources[0] = OUT;
mux_sources[1] = IN;
mux_sources[2] = inc_out;
mux_sources[3] = dec_out;
mux = [[MUX alloc] initNumBits:numbits numselectbits:2
select:merge_sel sources:mux_sources out:mux_out];
return self;
}
- free
{
//
// Free Internal Nodes:
//
[inc_out free];
[dec_out free];
[mux_out free];
[sel_low_out free];
[sel_high_out free];
//
// Free Internal Functional Units:
//
[mux free];
[merge_sel free];
[sel_low free];
[sel_high free];
[reg_load free];
[reg_inc free];
[reg_dec free];
[reg free];
return [super free];
}
- cycle
{
[sel_low cycle];
[sel_high cycle];
[merge_sel cycle];
[reg_inc cycle]; // Cycle the incrementer.
[reg_dec cycle]; // Cycle the decrementer.
[mux cycle]; // Cycle the MUX.
// fprintf(stdout, "IndexRegister: MUX Output: ");
// [mux_out dumpBinaryToFile:stdout];
// fprintf(stdout, " : ");
// [mux_out dumpHexToFile:stdout];
// fprintf(stdout, "\n");
[reg cycle]; // Cycle the register itself.
}
- reg
{
return reg;
}
@end
//
// End of file.
//These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.