feat: fixed up generate and generate test
last step is checking on uplc code gen
This commit is contained in:
parent
18ea44adb0
commit
518bea5be4
|
@ -11,6 +11,7 @@ use uplc::{
|
||||||
builder::{CONSTR_FIELDS_EXPOSER, CONSTR_GET_FIELD, CONSTR_INDEX_EXPOSER, EXPECT_ON_LIST},
|
builder::{CONSTR_FIELDS_EXPOSER, CONSTR_GET_FIELD, CONSTR_INDEX_EXPOSER, EXPECT_ON_LIST},
|
||||||
builtins::DefaultFunction,
|
builtins::DefaultFunction,
|
||||||
machine::cost_model::ExBudget,
|
machine::cost_model::ExBudget,
|
||||||
|
optimize::aiken_optimize_and_intern,
|
||||||
parser::interner::Interner,
|
parser::interner::Interner,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -24,7 +25,7 @@ use crate::{
|
||||||
gen_uplc::builder::{
|
gen_uplc::builder::{
|
||||||
convert_opaque_type, erase_opaque_type_operations, find_and_replace_generics,
|
convert_opaque_type, erase_opaque_type_operations, find_and_replace_generics,
|
||||||
get_arg_type_name, get_generic_id_and_type, get_variant_name, monomorphize,
|
get_arg_type_name, get_generic_id_and_type, get_variant_name, monomorphize,
|
||||||
CodeGenFunction, SpecificClause,
|
wrap_as_multi_validator, wrap_validator_condition, CodeGenFunction, SpecificClause,
|
||||||
},
|
},
|
||||||
tipo::{
|
tipo::{
|
||||||
ModuleValueConstructor, PatternConstructor, Type, TypeInfo, ValueConstructor,
|
ModuleValueConstructor, PatternConstructor, Type, TypeInfo, ValueConstructor,
|
||||||
|
@ -36,8 +37,9 @@ use crate::{
|
||||||
use self::{
|
use self::{
|
||||||
air::Air,
|
air::Air,
|
||||||
builder::{
|
builder::{
|
||||||
convert_type_to_data, lookup_data_type_by_tipo, modify_self_calls, rearrange_clauses,
|
cast_validator_args, convert_type_to_data, lookup_data_type_by_tipo, modify_self_calls,
|
||||||
AssignmentProperties, ClauseProperties, DataTypeKey, FunctionAccessKey, UserFunction,
|
rearrange_clauses, AssignmentProperties, ClauseProperties, DataTypeKey, FunctionAccessKey,
|
||||||
|
UserFunction,
|
||||||
},
|
},
|
||||||
tree::{AirExpression, AirTree, TreePath},
|
tree::{AirExpression, AirTree, TreePath},
|
||||||
};
|
};
|
||||||
|
@ -108,24 +110,58 @@ impl<'a> CodeGenerator<'a> {
|
||||||
..
|
..
|
||||||
}: &TypedValidator,
|
}: &TypedValidator,
|
||||||
) -> Program<Name> {
|
) -> Program<Name> {
|
||||||
let air_tree_fun = self.build(&fun.body);
|
let mut air_tree_fun = self.build(&fun.body);
|
||||||
|
|
||||||
|
air_tree_fun = wrap_validator_condition(air_tree_fun);
|
||||||
|
|
||||||
let mut validator_args_tree = self.check_validator_args(&fun.arguments, true, air_tree_fun);
|
let mut validator_args_tree = self.check_validator_args(&fun.arguments, true, air_tree_fun);
|
||||||
|
|
||||||
validator_args_tree = AirTree::no_op().hoist_over(validator_args_tree);
|
validator_args_tree = AirTree::no_op().hoist_over(validator_args_tree);
|
||||||
println!("{:#?}", validator_args_tree.to_vec());
|
|
||||||
|
|
||||||
let full_tree = self.hoist_functions_to_validator(validator_args_tree);
|
let full_tree = self.hoist_functions_to_validator(validator_args_tree);
|
||||||
|
|
||||||
// optimizations on air tree
|
// optimizations on air tree
|
||||||
|
|
||||||
let full_vec = full_tree.to_vec();
|
let full_vec = full_tree.to_vec();
|
||||||
println!("FULL VEC {:#?}", full_vec);
|
// println!("FULL VEC {:#?}", full_vec);
|
||||||
|
|
||||||
let mut term = self.uplc_code_gen(full_vec);
|
let mut term = self.uplc_code_gen(full_vec);
|
||||||
|
|
||||||
if let Some(other) = other_fun {}
|
if let Some(other) = other_fun {
|
||||||
|
self.reset();
|
||||||
|
|
||||||
todo!()
|
let mut air_tree_fun_other = self.build(&other.body);
|
||||||
|
|
||||||
|
air_tree_fun_other = wrap_validator_condition(air_tree_fun_other);
|
||||||
|
|
||||||
|
let mut validator_args_tree_other =
|
||||||
|
self.check_validator_args(&fun.arguments, true, air_tree_fun_other);
|
||||||
|
|
||||||
|
validator_args_tree_other = AirTree::no_op().hoist_over(validator_args_tree_other);
|
||||||
|
|
||||||
|
let full_tree_other = self.hoist_functions_to_validator(validator_args_tree_other);
|
||||||
|
|
||||||
|
// optimizations on air tree
|
||||||
|
|
||||||
|
let full_vec_other = full_tree_other.to_vec();
|
||||||
|
// println!("FULL VEC {:#?}", full_vec_other);
|
||||||
|
|
||||||
|
let other_term = self.uplc_code_gen(full_vec_other);
|
||||||
|
|
||||||
|
let (spend, mint) = if other.arguments.len() > fun.arguments.len() {
|
||||||
|
(other_term, term)
|
||||||
|
} else {
|
||||||
|
(term, other_term)
|
||||||
|
};
|
||||||
|
|
||||||
|
term = wrap_as_multi_validator(spend, mint);
|
||||||
|
|
||||||
|
self.needs_field_access = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
term = cast_validator_args(term, params);
|
||||||
|
|
||||||
|
self.finalize(term)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn generate_test(&mut self, test_body: &TypedExpr) -> Program<Name> {
|
pub fn generate_test(&mut self, test_body: &TypedExpr) -> Program<Name> {
|
||||||
|
@ -140,13 +176,39 @@ impl<'a> CodeGenerator<'a> {
|
||||||
|
|
||||||
let full_vec = full_tree.to_vec();
|
let full_vec = full_tree.to_vec();
|
||||||
|
|
||||||
println!("FULL VEC {:#?}", full_vec);
|
// println!("FULL VEC {:#?}", full_vec);
|
||||||
|
|
||||||
todo!()
|
let term = self.uplc_code_gen(full_vec);
|
||||||
|
|
||||||
|
self.finalize(term)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn finalize(&mut self, _term: Term<Name>) -> Program<Name> {
|
fn finalize(&mut self, mut term: Term<Name>) -> Program<Name> {
|
||||||
todo!()
|
if self.needs_field_access {
|
||||||
|
term = term
|
||||||
|
.constr_get_field()
|
||||||
|
.constr_fields_exposer()
|
||||||
|
.constr_index_exposer();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: Once SOP is implemented, new version is 1.1.0
|
||||||
|
let mut program = Program {
|
||||||
|
version: (1, 0, 0),
|
||||||
|
term,
|
||||||
|
};
|
||||||
|
|
||||||
|
program = aiken_optimize_and_intern(program);
|
||||||
|
|
||||||
|
// This is very important to call here.
|
||||||
|
// If this isn't done, re-using the same instance
|
||||||
|
// of the generator will result in free unique errors
|
||||||
|
// among other unpredictable things. In fact,
|
||||||
|
// switching to a shared code generator caused some
|
||||||
|
// instability issues and we fixed it by placing this
|
||||||
|
// method here.
|
||||||
|
self.reset();
|
||||||
|
|
||||||
|
program
|
||||||
}
|
}
|
||||||
|
|
||||||
fn build(&mut self, body: &TypedExpr) -> AirTree {
|
fn build(&mut self, body: &TypedExpr) -> AirTree {
|
||||||
|
|
|
@ -15,7 +15,7 @@ use uplc::{
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ast::{AssignmentKind, DataType, Pattern, Span, TypedArg, TypedClause, TypedDataType},
|
ast::{AssignmentKind, DataType, Pattern, Span, TypedArg, TypedClause, TypedDataType},
|
||||||
builtins::bool,
|
builtins::{bool, void},
|
||||||
expr::TypedExpr,
|
expr::TypedExpr,
|
||||||
tipo::{PatternConstructor, TypeVar, ValueConstructor, ValueConstructorVariant},
|
tipo::{PatternConstructor, TypeVar, ValueConstructor, ValueConstructorVariant},
|
||||||
};
|
};
|
||||||
|
@ -1374,3 +1374,10 @@ pub fn cast_validator_args(term: Term<Name>, arguments: &[TypedArg]) -> Term<Nam
|
||||||
}
|
}
|
||||||
term
|
term
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn wrap_validator_condition(air_tree: AirTree) -> AirTree {
|
||||||
|
let success_branch = vec![(air_tree, AirTree::void())];
|
||||||
|
let otherwise = AirTree::error(void());
|
||||||
|
|
||||||
|
AirTree::if_branches(success_branch, void(), otherwise)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue