public void addAtom(BSimFilterType type, String val) {
		if (type.isChildFilter()) {
			String exe = "unknown";
			if (val.charAt(0) == '[') {
				int i = val.indexOf(']');
				if (i >= 0) {
					exe = val.substring(1, i);
					val = val.substring(i + 1);
				}
			}
			ChildAtom childatom = new ChildAtom();
			childatom.type = type;
			childatom.value = null;
			childatom.name = val;
			childatom.exename = exe;
			atoms.add(childatom);
		}
		else {
			FilterAtom newatom = new FilterAtom(type, val);
			if (newatom.isValid()) {
				atoms.add(newatom);
				if (type instanceof FunctionTagBSimFilterType) {			// If this is a function tag filter
					int flag = ((FunctionTagBSimFilterType) type).getFlag();
					filterflags_mask |= flag;						// Accumulate the mask/value pair here
					if (newatom.value.equals("true")) {
						filterflags_value |= flag;
					}
				}
			}
		}
	}
Suitable for client side filtering by calling isFiltered with an ExecutableRecord
or evaluate with a FunctionDescription. Contains information for passing filter to 
server side. Each 'atom' of the filter (FilterAtom) is expressed as an operator and 
a value string. The operator (FilterType) indicates what part of the ExecutableRecord 
or FunctionDescription must match (or not match) the value string.
Ghidra/Features/BSim/src/main/java/ghidra/features/bsim/query/protocol/BSimFilter.java