protected String _createOffsetVariablesIfNeeded(IOPort port,
int channelNumber, int readTokens, int writeTokens)
throws IllegalActionException {
StringBuffer code = new StringBuffer();
CodeGeneratorHelper helper = (CodeGeneratorHelper) _getHelper(port
.getContainer());
boolean padBuffers = ((BooleanToken) _codeGenerator.padBuffers
.getToken()).booleanValue();
int bufferSize = helper.getBufferSize(port, channelNumber);
// Increase the buffer size of that channel to the power of two.
if (bufferSize > 0 && padBuffers) {
bufferSize = _padBuffer(port, channelNumber);
}
if (bufferSize != 0
&& (readTokens % bufferSize != 0 || writeTokens % bufferSize != 0)) {
int width;
if (port.isInput()) {
width = port.getWidth();
} else {
width = port.getWidthInside();
}
// We check again if the new bufferSize divides readTokens or
// writeTokens. If yes, we could avoid using variable to represent
// offset.
if (readTokens % bufferSize != 0) {
// Declare the read offset variable.
StringBuffer channelReadOffset = new StringBuffer();
channelReadOffset
.append(CodeGeneratorHelper.generateName(port));
if (width > 1) {
channelReadOffset.append("_" + channelNumber);
}
channelReadOffset.append("_readOffset");
String channelReadOffsetVariable = channelReadOffset.toString();
//code.append("static int " + channelReadOffsetVariable + " = "
// + helper.getReadOffset(port, channelNumber) + ";\n");
code.append("static int " + channelReadOffsetVariable + ";\n");
// Now replace the concrete offset with the variable.
helper.setReadOffset(port, channelNumber,
channelReadOffsetVariable);
}
if (writeTokens % bufferSize != 0) {
// Declare the write offset variable.
StringBuffer channelWriteOffset = new StringBuffer();
channelWriteOffset.append(CodeGeneratorHelper
.generateName(port));
if (width > 1) {
channelWriteOffset.append("_" + channelNumber);
}
channelWriteOffset.append("_writeOffset");
String channelWriteOffsetVariable = channelWriteOffset
.toString();
code.append("static int " + channelWriteOffsetVariable + ";\n");
// Now replace the concrete offset with the variable.
helper.setWriteOffset(port, channelNumber,
channelWriteOffsetVariable);
}
}
return code.toString();
}