use of gov.sandia.n2a.language.Operator in project n2a by frothga.
the class ExportJob method genericPart.
public void genericPart(MPart part, Element result, String... skip) {
EquationSet partEquations = getEquations(part);
List<Element> resultElements = new ArrayList<Element>();
List<String> skipList = Arrays.asList(skip);
for (MNode c : part) {
MPart p = (MPart) c;
String key = p.key();
// Skip connection bindings. They are unpacked elsewhere.
if (partEquations.findConnection(key) != null)
continue;
if (key.startsWith("$"))
continue;
if (skipList.contains(key))
continue;
if (p.isPart()) {
genericPart(p, resultElements);
} else {
// We need to check two things:
// * Has the variable been overridden after it was declared in the base part?
// * Is it an expression or a constant?
// An override that is an expression should trigger a LEMS extension part.
// A constant that is either overridden or required should be emitted here.
boolean expression = true;
String value = p.get();
Variable v = partEquations.find(new Variable(key));
try {
// This could convert an expression to a constant.
Type evalue = v.eval(context);
// TODO: if it is a simple AccessVariable, then it shouldn't be viewed as an expression.
Operator op = Operator.parse(value);
if (op instanceof Constant) {
// "direct" value
Type dvalue = ((Constant) op).value;
expression = !evalue.equals(dvalue);
}
} catch (Exception e) {
}
boolean overridden = p.isFromTopDocument() || isOverride(part.get("$inherit").replace("\"", ""), key);
String name = sequencer.bestFieldName(result, p.get("$metadata", "backend.lems.param"));
if (name.isEmpty())
name = key;
boolean required = sequencer.isRequired(result, name);
if (required || (overridden && !expression)) {
// biophysicalUnits() should return strings (non-numbers) unmodified
result.setAttribute(name, biophysicalUnits(p.get()));
}
}
}
sequencer.append(result, resultElements);
}
use of gov.sandia.n2a.language.Operator in project n2a by frothga.
the class JobC method prepareStaticObjects.
public void prepareStaticObjects(Operator op, final CRenderer context, final String pad) throws Exception {
Visitor visitor = new Visitor() {
public boolean visit(Operator op) {
if (op instanceof Output) {
Output o = (Output) op;
if (// column name is generated
o.operands.length < 3) {
String stringName = stringNames.get(op);
BackendDataC bed = (BackendDataC) context.part.backendData;
if (context.global ? bed.needGlobalPath : bed.needLocalPath) {
context.result.append(pad + "path (" + stringName + ");\n");
context.result.append(pad + stringName + " += \"." + o.variableName + "\";\n");
} else {
context.result.append(pad + stringName + " = \"" + o.variableName + "\";\n");
}
} else if (// mode flags are present
o.operands.length > 3) {
if (o.operands[0] instanceof Constant) {
// Detect raw flag
Operator op3 = o.operands[3];
if (op3 instanceof Constant) {
if (op3.toString().contains("raw")) {
String outputName = outputNames.get(o.operands[0].toString());
context.result.append(pad + outputName + "->raw = true;\n");
}
}
}
}
// Continue to drill down, because I/O functions can be nested.
return true;
}
if (op instanceof Input) {
Input i = (Input) op;
if (i.operands[0] instanceof Constant) {
String inputName = inputNames.get(i.operands[0].toString());
if (!context.global) {
context.result.append(pad + inputName + "->epsilon = " + resolve(context.bed.dt.reference, context, false) + " / 1000;\n");
}
// Detect time flag
String mode = "";
if (i.operands.length > 3) {
// just assuming it's a constant string
mode = i.operands[3].toString();
} else if (i.operands[1] instanceof Constant) {
Constant c = (Constant) i.operands[1];
if (c.value instanceof Text)
mode = c.toString();
}
if (mode.contains("time")) {
context.result.append(pad + inputName + "->time = true;\n");
}
}
return true;
}
return true;
}
};
op.visit(visitor);
}
Aggregations