Skip to content

Commit

Permalink
Add enums for operators as part of Tree Sitter migration
Browse files Browse the repository at this point in the history
  • Loading branch information
VonTum committed Mar 23, 2024
1 parent 65dc229 commit 86daa06
Show file tree
Hide file tree
Showing 7 changed files with 427 additions and 192 deletions.
6 changes: 3 additions & 3 deletions src/codegen_fallback.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::{iter::zip, ops::Deref};

use crate::{ast::Module, flattening::Instruction, instantiation::{ConnectToPathElem, InstantiatedModule, RealWire, RealWireDataSource, WireID}, linker::{get_builtin_type, TypeUUID}, tokenizer::get_token_type_name, typing::ConcreteType};
use crate::{ast::Module, flattening::Instruction, instantiation::{ConnectToPathElem, InstantiatedModule, RealWire, RealWireDataSource, WireID}, linker::{get_builtin_type, TypeUUID}, typing::ConcreteType};

fn get_type_name_size(id : TypeUUID) -> u64 {
if id == get_builtin_type("int") {
Expand Down Expand Up @@ -130,10 +130,10 @@ impl<'g, 'out, Stream : std::fmt::Write> CodeGenerationContext<'g, 'out, Stream>

match &w.source {
RealWireDataSource::UnaryOp { op, right } => {
writeln!(self.program_text, " = {}{};", get_token_type_name(op.op_typ), self.wire_name(*right, w.absolute_latency))?;
writeln!(self.program_text, " = {}{};", op.op_text(), self.wire_name(*right, w.absolute_latency))?;
}
RealWireDataSource::BinaryOp { op, left, right } => {
writeln!(self.program_text, " = {} {} {};", self.wire_name(*left, w.absolute_latency), get_token_type_name(op.op_typ), self.wire_name(*right, w.absolute_latency))?;
writeln!(self.program_text, " = {} {} {};", self.wire_name(*left, w.absolute_latency), op.op_text(), self.wire_name(*right, w.absolute_latency))?;
}
RealWireDataSource::ArrayAccess { arr, arr_idx } => {
writeln!(self.program_text, " = {}[{}];", self.wire_name(*arr, w.absolute_latency), self.wire_name(*arr_idx, w.absolute_latency))?;
Expand Down
473 changes: 354 additions & 119 deletions src/flattening/mod.rs

Large diffs are not rendered by default.

14 changes: 7 additions & 7 deletions src/instantiation/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use std::{cell::RefCell, cmp::max, iter::zip, ops::Deref, rc::Rc};

use num::BigInt;

use crate::{arena_alloc::{FlatAlloc, UUIDMarker, UUIDRange, UUID}, ast::{IdentifierType, InterfacePorts, Operator}, errors::ErrorCollector, file_position::Span, flattening::{ConnectionWritePathElement, ConnectionWritePathElementComputed, FlatID, FlatIDMarker, FlatIDRange, FlattenedModule, Instruction, WireInstance, WireSource, Write, WriteType}, instantiation::latency_algorithm::{convert_fanin_to_fanout, solve_latencies, FanInOut, LatencyCountingError}, linker::{Linker, NamedConstant}, list_of_lists::ListOfLists, tokenizer::kw, typing::{ConcreteType, Type, BOOL_CONCRETE_TYPE, INT_CONCRETE_TYPE}, value::{compute_binary_op, compute_unary_op, Value}};
use crate::{arena_alloc::{FlatAlloc, UUIDMarker, UUIDRange, UUID}, ast::{IdentifierType, InterfacePorts}, errors::ErrorCollector, file_position::Span, flattening::{BinaryOperator, ConnectionWritePathElement, ConnectionWritePathElementComputed, FlatID, FlatIDMarker, FlatIDRange, FlattenedModule, Instruction, UnaryOperator, WireInstance, WireSource, Write, WriteType}, instantiation::latency_algorithm::{convert_fanin_to_fanout, solve_latencies, FanInOut, LatencyCountingError}, linker::{Linker, NamedConstant}, list_of_lists::ListOfLists, typing::{ConcreteType, Type, BOOL_CONCRETE_TYPE, INT_CONCRETE_TYPE}, value::{compute_binary_op, compute_unary_op, Value}};

use self::latency_algorithm::SpecifiedLatency;

Expand Down Expand Up @@ -57,8 +57,8 @@ impl MultiplexerSource {
pub enum RealWireDataSource {
ReadOnly,
Multiplexer{is_state : Option<Value>, sources : Vec<MultiplexerSource>},
UnaryOp{op : Operator, right : WireID},
BinaryOp{op : Operator, left : WireID, right : WireID},
UnaryOp{op : UnaryOperator, right : WireID},
BinaryOp{op : BinaryOperator, left : WireID, right : WireID},
ArrayAccess{arr : WireID, arr_idx : WireID},
ConstArrayAccess{arr : WireID, arr_idx : u64},
Constant{value : Value}
Expand Down Expand Up @@ -365,12 +365,12 @@ impl<'fl, 'l> InstantiationContext<'fl, 'l> {
}
&WireSource::UnaryOp{op, right} => {
let right = self.get_wire_or_constant_as_wire(right)?;
RealWireDataSource::UnaryOp{op: op, right}
RealWireDataSource::UnaryOp{op, right}
}
&WireSource::BinaryOp{op, left, right} => {
let left = self.get_wire_or_constant_as_wire(left)?;
let right = self.get_wire_or_constant_as_wire(right)?;
RealWireDataSource::BinaryOp{op: op, left, right}
RealWireDataSource::BinaryOp{op, left, right}
}
&WireSource::ArrayAccess{arr, arr_idx} => {
let arr = self.get_wire_or_constant_as_wire(arr)?;
Expand Down Expand Up @@ -400,7 +400,7 @@ impl<'fl, 'l> InstantiationContext<'fl, 'l> {
name : self.get_unique_name(),
original_wire,
source : RealWireDataSource::BinaryOp{
op: Operator{op_typ : kw("&")},
op: BinaryOperator::And,
left : condition,
right : additional_condition
},
Expand Down Expand Up @@ -492,7 +492,7 @@ impl<'fl, 'l> InstantiationContext<'fl, 'l> {
name : self.get_unique_name(),
original_wire,
source : RealWireDataSource::UnaryOp{
op : Operator{op_typ : kw("!")},
op : UnaryOperator::Not,
right : condition_wire
},
absolute_latency : CALCULATE_LATENCY_LATER, needed_until : CALCULATE_LATENCY_LATER
Expand Down
6 changes: 4 additions & 2 deletions src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -806,6 +806,7 @@ pub struct SusTreeSitterSingleton {
pub binary_op_kind : u16,
pub array_op_kind : u16,
pub func_call_kind : u16,
pub parenthesis_expression_kind : u16,
pub range_kind : u16,
pub block_kind : u16,
pub decl_assign_statement_kind : u16,
Expand All @@ -829,7 +830,7 @@ pub struct SusTreeSitterSingleton {
pub operator_field : NonZeroU16,
pub arr_field : NonZeroU16,
pub arr_idx_field : NonZeroU16,
pub func_arguments_field : NonZeroU16,
pub argument_field : NonZeroU16,
pub from_field : NonZeroU16,
pub to_field : NonZeroU16,
pub assign_to_field : NonZeroU16,
Expand Down Expand Up @@ -857,6 +858,7 @@ impl SusTreeSitterSingleton {
binary_op_kind : language.id_for_node_kind("binary_op", true),
array_op_kind : language.id_for_node_kind("array_op", true),
func_call_kind : language.id_for_node_kind("func_call", true),
parenthesis_expression_kind : language.id_for_node_kind("parenthesis_expression", true),
range_kind : language.id_for_node_kind("range", true),
block_kind : language.id_for_node_kind("block", true),
decl_assign_statement_kind : language.id_for_node_kind("decl_assign_statement", true),
Expand All @@ -880,7 +882,7 @@ impl SusTreeSitterSingleton {
operator_field : language.field_id_for_name("operator").unwrap(),
arr_field : language.field_id_for_name("arr").unwrap(),
arr_idx_field : language.field_id_for_name("arr_idx").unwrap(),
func_arguments_field : language.field_id_for_name("func_arguments").unwrap(),
argument_field : language.field_id_for_name("argument").unwrap(),
from_field : language.field_id_for_name("from").unwrap(),
to_field : language.field_id_for_name("to").unwrap(),
assign_to_field : language.field_id_for_name("assign_to").unwrap(),
Expand Down
52 changes: 26 additions & 26 deletions src/typing.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::ops::Deref;

use crate::{arena_alloc::ArenaAllocator, ast::Operator, errors::ErrorCollector, file_position::Span, flattening::FlatID, linker::{get_builtin_type, Linkable, Linker, NamedType, TypeUUID, TypeUUIDMarker}, tokenizer::kw, value::Value};
use crate::{arena_alloc::ArenaAllocator, errors::ErrorCollector, file_position::Span, flattening::{BinaryOperator, FlatID, UnaryOperator}, linker::{get_builtin_type, Linkable, Linker, NamedType, TypeUUID, TypeUUIDMarker}, value::Value};

// These are
#[derive(Debug, Clone)]
Expand Down Expand Up @@ -113,20 +113,20 @@ pub const INT_TYPE : Type = Type::Named(get_builtin_type("int"));
pub const BOOL_CONCRETE_TYPE : ConcreteType = ConcreteType::Named(get_builtin_type("bool"));
pub const INT_CONCRETE_TYPE : ConcreteType = ConcreteType::Named(get_builtin_type("int"));

pub fn typecheck_unary_operator(op : Operator, input_typ : &Type, span : Span, linker_types : &ArenaAllocator<NamedType, TypeUUIDMarker>, errors : &ErrorCollector) -> Type {
if op.op_typ == kw("!") {
pub fn typecheck_unary_operator(op : UnaryOperator, input_typ : &Type, span : Span, linker_types : &ArenaAllocator<NamedType, TypeUUIDMarker>, errors : &ErrorCollector) -> Type {
if op == UnaryOperator::Not {
typecheck(input_typ, span, &BOOL_TYPE, "! input", linker_types, errors);
BOOL_TYPE
} else if op.op_typ == kw("-") {
} else if op == UnaryOperator::Negate {
typecheck(input_typ, span, &INT_TYPE, "- input", linker_types, errors);
INT_TYPE
} else {
let gather_type = match op.op_typ {
x if x == kw("&") => BOOL_TYPE,
x if x == kw("|") => BOOL_TYPE,
x if x == kw("^") => BOOL_TYPE,
x if x == kw("+") => INT_TYPE,
x if x == kw("*") => INT_TYPE,
let gather_type = match op {
UnaryOperator::And => BOOL_TYPE,
UnaryOperator::Or => BOOL_TYPE,
UnaryOperator::Xor => BOOL_TYPE,
UnaryOperator::Sum => INT_TYPE,
UnaryOperator::Product => INT_TYPE,
_ => unreachable!()
};
if let Some(arr_content_typ) = typecheck_is_array_indexer(input_typ, span, linker_types, errors) {
Expand All @@ -135,22 +135,22 @@ pub fn typecheck_unary_operator(op : Operator, input_typ : &Type, span : Span, l
gather_type
}
}
pub fn get_binary_operator_types(op : Operator) -> ((Type, Type), Type) {
match op.op_typ {
x if x == kw("&") => ((BOOL_TYPE, BOOL_TYPE), BOOL_TYPE),
x if x == kw("|") => ((BOOL_TYPE, BOOL_TYPE), BOOL_TYPE),
x if x == kw("^") => ((BOOL_TYPE, BOOL_TYPE), BOOL_TYPE),
x if x == kw("+") => ((INT_TYPE, INT_TYPE), INT_TYPE),
x if x == kw("-") => ((INT_TYPE, INT_TYPE), INT_TYPE),
x if x == kw("*") => ((INT_TYPE, INT_TYPE), INT_TYPE),
x if x == kw("/") => ((INT_TYPE, INT_TYPE), INT_TYPE),
x if x == kw("%") => ((INT_TYPE, INT_TYPE), INT_TYPE),
x if x == kw("==") => ((INT_TYPE, INT_TYPE), BOOL_TYPE),
x if x == kw("!=") => ((INT_TYPE, INT_TYPE), BOOL_TYPE),
x if x == kw(">=") => ((INT_TYPE, INT_TYPE), BOOL_TYPE),
x if x == kw("<=") => ((INT_TYPE, INT_TYPE), BOOL_TYPE),
x if x == kw(">") => ((INT_TYPE, INT_TYPE), BOOL_TYPE),
x if x == kw("<") => ((INT_TYPE, INT_TYPE), BOOL_TYPE),
pub fn get_binary_operator_types(op : BinaryOperator) -> ((Type, Type), Type) {
match op {
BinaryOperator::And => ((BOOL_TYPE, BOOL_TYPE), BOOL_TYPE),
BinaryOperator::Or => ((BOOL_TYPE, BOOL_TYPE), BOOL_TYPE),
BinaryOperator::Xor => ((BOOL_TYPE, BOOL_TYPE), BOOL_TYPE),
BinaryOperator::Add => ((INT_TYPE, INT_TYPE), INT_TYPE),
BinaryOperator::Subtract => ((INT_TYPE, INT_TYPE), INT_TYPE),
BinaryOperator::Multiply => ((INT_TYPE, INT_TYPE), INT_TYPE),
BinaryOperator::Divide => ((INT_TYPE, INT_TYPE), INT_TYPE),
BinaryOperator::Modulo => ((INT_TYPE, INT_TYPE), INT_TYPE),
BinaryOperator::Equals => ((INT_TYPE, INT_TYPE), BOOL_TYPE),
BinaryOperator::NotEquals => ((INT_TYPE, INT_TYPE), BOOL_TYPE),
BinaryOperator::GreaterEq => ((INT_TYPE, INT_TYPE), BOOL_TYPE),
BinaryOperator::Greater => ((INT_TYPE, INT_TYPE), BOOL_TYPE),
BinaryOperator::LesserEq => ((INT_TYPE, INT_TYPE), BOOL_TYPE),
BinaryOperator::Lesser => ((INT_TYPE, INT_TYPE), BOOL_TYPE),
_ => unreachable!()
}
}
Expand Down
66 changes: 32 additions & 34 deletions src/value.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use std::ops::Deref;

use num::BigInt;

use crate::{typing::{Type, ConcreteType, BOOL_TYPE, INT_TYPE, INT_CONCRETE_TYPE, BOOL_CONCRETE_TYPE}, ast::Operator, tokenizer::kw};
use crate::{flattening::{BinaryOperator, UnaryOperator}, typing::{ConcreteType, Type, BOOL_CONCRETE_TYPE, BOOL_TYPE, INT_CONCRETE_TYPE, INT_TYPE}};

#[derive(Debug,Clone,PartialEq,Eq)]
pub enum Value {
Expand Down Expand Up @@ -91,59 +91,57 @@ impl Value {
}
}

pub fn compute_unary_op(op : Operator, v : &Value) -> Value {
pub fn compute_unary_op(op : UnaryOperator, v : &Value) -> Value {
if *v == Value::Error {
return Value::Error
}
match op.op_typ {
typ if typ == kw("|") => {
match op {
UnaryOperator::Or => {
todo!("Array Values")
}
typ if typ == kw("&") => {
UnaryOperator::And => {
todo!("Array Values")
}
typ if typ == kw("^") => {
UnaryOperator::Xor => {
todo!("Array Values")
}
typ if typ == kw("-") => {
let Value::Integer(v) = v else {panic!()};
Value::Integer(-v)
UnaryOperator::Not => {
let Value::Bool(b) = v else {panic!()};
Value::Bool(!*b)
}
typ if typ == kw("+") => {
UnaryOperator::Sum => {
todo!("Array Values")
}
typ if typ == kw("*") => {
UnaryOperator::Product => {
todo!("Array Values")
}
typ if typ == kw("!") => {
let Value::Bool(b) = v else {panic!()};
Value::Bool(!*b)
UnaryOperator::Negate => {
let Value::Integer(v) = v else {panic!()};
Value::Integer(-v)
}
_other => unreachable!()
}
}

pub fn compute_binary_op(left : &Value, op : Operator, right : &Value) -> Value {
pub fn compute_binary_op(left : &Value, op : BinaryOperator, right : &Value) -> Value {
if *left == Value::Error || *right == Value::Error {
return Value::Error
}
match op.op_typ {
typ if typ == kw("<=") => Value::Bool(left.extract_integer() <= right.extract_integer()),
typ if typ == kw(">=") => Value::Bool(left.extract_integer() >= right.extract_integer()),
typ if typ == kw("<") => Value::Bool(left.extract_integer() < right.extract_integer()),
typ if typ == kw(">") => Value::Bool(left.extract_integer() > right.extract_integer()),
typ if typ == kw("==") => Value::Bool(left == right),
typ if typ == kw("!=") => Value::Bool(left != right),
typ if typ == kw("<<") => todo!(), // Still a bit iffy about shift operator inclusion
typ if typ == kw(">>") => todo!(),
typ if typ == kw("+") => Value::Integer(left.extract_integer() + right.extract_integer()),
typ if typ == kw("-") => Value::Integer(left.extract_integer() - right.extract_integer()),
typ if typ == kw("*") => Value::Integer(left.extract_integer() * right.extract_integer()),
typ if typ == kw("/") => Value::Integer(left.extract_integer() / right.extract_integer()),
typ if typ == kw("%") => Value::Integer(left.extract_integer() % right.extract_integer()),
typ if typ == kw("&") => Value::Bool(left.extract_bool() & right.extract_bool()),
typ if typ == kw("|") => Value::Bool(left.extract_bool() & right.extract_bool()),
typ if typ == kw("^") => Value::Bool(left.extract_bool() & right.extract_bool()),
_other => unreachable!()
match op {
BinaryOperator::Equals => Value::Bool(left == right),
BinaryOperator::NotEquals => Value::Bool(left != right),
BinaryOperator::GreaterEq => Value::Bool(left.extract_integer() >= right.extract_integer()),
BinaryOperator::Greater => Value::Bool(left.extract_integer() > right.extract_integer()),
BinaryOperator::LesserEq => Value::Bool(left.extract_integer() <= right.extract_integer()),
BinaryOperator::Lesser => Value::Bool(left.extract_integer() < right.extract_integer()),
BinaryOperator::Add => Value::Integer(left.extract_integer() + right.extract_integer()),
BinaryOperator::Subtract => Value::Integer(left.extract_integer() - right.extract_integer()),
BinaryOperator::Multiply => Value::Integer(left.extract_integer() * right.extract_integer()),
BinaryOperator::Divide => Value::Integer(left.extract_integer() / right.extract_integer()),
BinaryOperator::Modulo => Value::Integer(left.extract_integer() % right.extract_integer()),
BinaryOperator::And => Value::Bool(left.extract_bool() & right.extract_bool()),
BinaryOperator::Or => Value::Bool(left.extract_bool() & right.extract_bool()),
BinaryOperator::Xor => Value::Bool(left.extract_bool() & right.extract_bool()),
BinaryOperator::ShiftLeft => todo!(), // Still a bit iffy about shift operator inclusion
BinaryOperator::ShiftRight => todo!()
}
}
2 changes: 1 addition & 1 deletion tree-sitter-sus
Submodule tree-sitter-sus updated 5 files
+1 −1 Cargo.toml
+8 −2 grammar.js
+55 −43 src/grammar.json
+109 −117 src/node-types.json
+1,754 −1,698 src/parser.c

0 comments on commit 86daa06

Please sign in to comment.