Search in sources :

Example 81 with Node

use of suite.node.Node in project suite by stupidsing.

the class NodifyTest method testMapify.

@Test
public void testMapify() {
    ProverConfig pc0 = new ProverConfig();
    pc0.setRuleSet(null);
    Node node = nodify.nodify(ProverConfig.class, pc0);
    assertNotNull(node);
    System.out.println(node);
    ProverConfig pc1 = nodify.unnodify(ProverConfig.class, node);
    System.out.println(pc1);
    assertEquals(pc0, pc1);
    assertTrue(pc0.hashCode() == pc1.hashCode());
}
Also used : Node(suite.node.Node) ProverConfig(suite.lp.Configuration.ProverConfig) Test(org.junit.Test)

Example 82 with Node

use of suite.node.Node in project suite by stupidsing.

the class NodifyTest method testPolymorphism.

// when mapifying a field with interface type, it would automatically embed
// object type information (i.e. class name), and un-mapify accordingly.
@Test
public void testPolymorphism() {
    A a = new A();
    B b = new B();
    Container object0 = new Container();
    object0.is = List.of(a, b);
    Node node = nodify.nodify(Container.class, object0);
    assertNotNull(node);
    System.out.println(node);
    Container object1 = nodify.unnodify(Container.class, node);
    assertEquals(A.class, object1.is.get(0).getClass());
    assertEquals(B.class, object1.is.get(1).getClass());
    assertEquals(123, ((A) object1.is.get(0)).i);
    assertEquals(2, ((A) object1.is.get(0)).ints[2]);
    assertEquals("test", ((B) object1.is.get(1)).s);
    assertEquals(123, ((A) object1.array[0]).i);
    assertEquals(2, ((A) object1.array[0]).ints[2]);
    assertEquals("test", ((B) object1.array[1]).s);
}
Also used : Node(suite.node.Node) Test(org.junit.Test)

Example 83 with Node

use of suite.node.Node in project suite by stupidsing.

the class Assembler method assemble.

public Bytes assemble(Node input) {
    Generalizer generalizer = new Generalizer();
    Trail trail = new Trail();
    List<Pair<Reference, Node>> lnis = new ArrayList<>();
    for (Node node0 : Tree.iter(input)) {
        Node node = generalizer.generalize(node0);
        Tree tree;
        if ((tree = Tree.decompose(node, TermOp.EQUAL_)) != null)
            if (!Binder.bind(tree.getLeft(), tree.getRight(), trail))
                Fail.t("bind failed");
            else
                ;
        else if ((tree = Tree.decompose(node, TermOp.TUPLE_)) != null)
            lnis.add(Pair.of((Reference) tree.getLeft(), tree.getRight()));
        else
            Fail.t("cannot assemble " + node);
    }
    return assemble(generalizer, preassemble.apply(lnis));
}
Also used : Generalizer(suite.lp.doer.Generalizer) Trail(suite.lp.Trail) Reference(suite.node.Reference) Node(suite.node.Node) ArrayList(java.util.ArrayList) Tree(suite.node.Tree) Pair(suite.adt.pair.Pair)

Example 84 with Node

use of suite.node.Node in project suite by stupidsing.

the class PeepholeOptimizer method optimize.

public List<Pair<Reference, Node>> optimize(List<Pair<Reference, Node>> lnis0) {
    List<Pair<Reference, Node>> lnis1 = new ArrayList<>();
    for (Pair<Reference, Node> lni0 : lnis0) {
        Node node0 = lni0.t1;
        Node node1;
        Node[] m;
        if ((m = ADDI__.match(node0)) != null) {
            Node m0 = m[0];
            int i = TreeUtil.evaluate(m[1]);
            if (i == 1)
                node1 = Suite.substitute("INC .0", m0);
            else if (i == -1)
                node1 = Suite.substitute("DEC .0", m0);
            else if (0 < i)
                node1 = Suite.substitute("ADD (.0, .1)", m0, Int.of(i));
            else if (i < 0)
                node1 = Suite.substitute("SUB (.0, .1)", m0, Int.of(-i));
            else
                node1 = Atom.NIL;
        } else if ((m = MOV___.match(node0)) != null) {
            Node m0 = m[0];
            Node m1 = m[1];
            if (m0 == m1)
                node1 = Atom.NIL;
            else if (m0 instanceof Atom && m1 instanceof Int && ((Int) m1).number == 0)
                node1 = Suite.substitute("XOR (.0, .0)", m0);
            else
                node1 = Suite.substitute("MOV (.0, .1)", m0, m1);
        } else
            node1 = node0;
        lnis1.add(Pair.of(lni0.t0, node1));
    }
    return lnis1;
}
Also used : Reference(suite.node.Reference) Node(suite.node.Node) ArrayList(java.util.ArrayList) Atom(suite.node.Atom) Int(suite.node.Int) Pair(suite.adt.pair.Pair)

Example 85 with Node

use of suite.node.Node in project suite by stupidsing.

the class StackAssembler method preassemble.

private List<Pair<Reference, Node>> preassemble(List<Pair<Reference, Node>> lnis0) {
    List<Pair<Reference, Node>> lnis1 = new ArrayList<>();
    Deque<int[]> deque = new ArrayDeque<>();
    Trail trail = new Trail();
    int fs = 0, rs = 0;
    for (Pair<Reference, Node> lni0 : lnis0) {
        Node node0 = lni0.t1;
        Node node1;
        Node[] m;
        if ((m = FRBGN_.match(node0)) != null) {
            deque.push(new int[] { fs, rs });
            fs = 0;
            rs = 0;
            node1 = Atom.NIL;
        } else if ((m = FREND_.match(node0)) != null) {
            if (fs != 0)
                node1 = Fail.t("unbalanced frame stack in subroutine definition");
            else if (rs != 0)
                node1 = Fail.t("unbalanced register stack in subroutine definition");
            else {
                int[] arr = deque.pop();
                fs = arr[0];
                rs = arr[1];
            }
            node1 = Atom.NIL;
        } else if ((m = FRGET_.match(node0)) != null)
            if (Binder.bind(m[0], Int.of(-fs), trail))
                node1 = Atom.NIL;
            else
                node1 = Fail.t("cannot bind local variable offset");
        else if ((m = FRPOP_.match(node0)) != null) {
            fs -= 4;
            node1 = Suite.substitute("POP .0", rewrite(rs, m[0]));
        } else if ((m = FRPOPN.match(node0)) != null) {
            Int int_ = (Int) m[0].finalNode();
            fs -= int_.number;
            node1 = Atom.NIL;
        } else if ((m = FRPSH_.match(node0)) != null) {
            fs += 4;
            node1 = Suite.substitute("PUSH .0", rewrite(rs, m[0]));
        } else if ((m = FRPSHN.match(node0)) != null) {
            Int int_ = (Int) m[0].finalNode();
            fs += int_.number;
            node1 = Atom.NIL;
        } else if ((m = LET___.match(node0)) != null)
            if (Binder.bind(m[0], Int.of(TreeUtil.evaluate(m[1])), trail))
                node1 = Atom.NIL;
            else
                node1 = Fail.t("cannot calculate expression");
        else if (node0 == RPOP__) {
            rs--;
            node1 = Atom.NIL;
        } else if (node0 == RPSH__) {
            rs++;
            node1 = Atom.NIL;
        } else if (node0 == RRESTA) {
            fs -= 4 * rs;
            for (int r = rs - 1; 0 <= r; r--) lnis1.add(Pair.of(new Reference(), Suite.substitute("POP .0", getRegister(r))));
            node1 = Atom.NIL;
        } else if (node0 == RSAVEA) {
            for (int r = 0; r < rs; r++) lnis1.add(Pair.of(new Reference(), Suite.substitute("PUSH .0", getRegister(r))));
            fs += 4 * rs;
            node1 = Atom.NIL;
        } else
            node1 = rewrite(rs, node0);
        lnis1.add(Pair.of(lni0.t0, node1));
    }
    return new PeepholeOptimizer().optimize(lnis1);
}
Also used : Reference(suite.node.Reference) Node(suite.node.Node) ArrayList(java.util.ArrayList) ArrayDeque(java.util.ArrayDeque) Int(suite.node.Int) Trail(suite.lp.Trail) Pair(suite.adt.pair.Pair)

Aggregations

Node (suite.node.Node)139 Tree (suite.node.Tree)50 Reference (suite.node.Reference)41 Atom (suite.node.Atom)37 Int (suite.node.Int)33 ArrayList (java.util.ArrayList)32 Pair (suite.adt.pair.Pair)25 List (java.util.List)24 TermOp (suite.node.io.TermOp)21 Read (suite.streamlet.Read)21 Test (org.junit.Test)20 Map (java.util.Map)19 Suite (suite.Suite)18 Generalizer (suite.lp.doer.Generalizer)18 Fail (suite.util.Fail)18 Fun (suite.util.FunUtil.Fun)18 Str (suite.node.Str)17 Trail (suite.lp.Trail)16 RuleSet (suite.lp.kb.RuleSet)16 Tuple (suite.node.Tuple)16