#include <poplar/Vertex.hpp>
#include <poplar/StackSizeDefs.hpp>
#include "IPUlisp.h"
// Bound recursive interpreter stack use for Poplar's static stack allocation.
DEF_STACK_USAGE(32 * 1024, "IPUlisp_eval");
DEF_STACK_USAGE(32, "IPUlisp_collections");
class LispVertex : public poplar::Vertex {
public:
    poplar::Input<poplar::Vector<char>> source;
    poplar::Output<poplar::Vector<char>> output;
    poplar::Input<unsigned> length;
    poplar::Input<unsigned> reset;
    poplar::Input<unsigned> stress;
    poplar::Output<int> status;
    poplar::Output<unsigned> collections;
    unsigned tile;
    bool compute() {
        *status = IPUlisp_eval(&source[0], *length, &output[0], output.size(),
                              tile, *reset, *stress);
        *collections = IPUlisp_collections();
        return true;
    }
};
