add a data builtin and do ex_mem for pairs, list, data
This commit is contained in:
parent
45e22c1ea8
commit
73e367ad53
|
@ -8,6 +8,7 @@ version = "0.0.10"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"clap",
|
"clap",
|
||||||
|
"hex",
|
||||||
"uplc",
|
"uplc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -251,16 +252,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a5e575910763b21a0db7df5e142907fe944bff84d1dfc78e2ba92e7f3bdfd36b"
|
checksum = "a5e575910763b21a0db7df5e142907fe944bff84d1dfc78e2ba92e7f3bdfd36b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"half",
|
"half",
|
||||||
"minicbor-derive 0.11.0",
|
"minicbor-derive",
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "minicbor"
|
|
||||||
version = "0.18.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "2a20020e8e2d1881d8736f64011bb5ff99f1db9947ce3089706945c8915695cb"
|
|
||||||
dependencies = [
|
|
||||||
"minicbor-derive 0.12.0",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -274,17 +266,6 @@ dependencies = [
|
||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "minicbor-derive"
|
|
||||||
version = "0.12.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "8608fb1c805b5b6b3d5ab7bd95c40c396df622b64d77b2d621a5eae1eed050ee"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num-traits"
|
name = "num-traits"
|
||||||
version = "0.2.15"
|
version = "0.2.15"
|
||||||
|
@ -306,7 +287,7 @@ version = "0.12.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0dce0ea17341c1a0e43e2bb4a637740198dcb09826879ce3ac5ae1c6f4398a5d"
|
checksum = "0dce0ea17341c1a0e43e2bb4a637740198dcb09826879ce3ac5ae1c6f4398a5d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"minicbor 0.17.1",
|
"minicbor",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -646,7 +627,7 @@ dependencies = [
|
||||||
"cryptoxide",
|
"cryptoxide",
|
||||||
"flat-rs",
|
"flat-rs",
|
||||||
"hex",
|
"hex",
|
||||||
"minicbor 0.18.0",
|
"minicbor",
|
||||||
"pallas-primitives",
|
"pallas-primitives",
|
||||||
"peg",
|
"peg",
|
||||||
"pretty",
|
"pretty",
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
(program
|
(program
|
||||||
1.0.0
|
1.0.0
|
||||||
[ (builtin remainderInteger) (con integer 5) (con integer 2)]
|
(con (pair bool integer) (True, 1))
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -13,4 +13,5 @@ authors = ["Lucas Rosa <x@rvcas.dev>", "Kasey White <kwhitemsg@gmail.com>"]
|
||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0.57"
|
anyhow = "1.0.57"
|
||||||
clap = { version = "3.1.14", features = ["derive"] }
|
clap = { version = "3.1.14", features = ["derive"] }
|
||||||
|
hex = "0.4.3"
|
||||||
uplc = { path = '../uplc', version = "0.0.10" }
|
uplc = { path = '../uplc', version = "0.0.10" }
|
||||||
|
|
|
@ -16,7 +16,7 @@ exclude = ["test_data/*"]
|
||||||
cryptoxide = "0.4.2"
|
cryptoxide = "0.4.2"
|
||||||
flat-rs = { path = "../flat", version = "0.0.10" }
|
flat-rs = { path = "../flat", version = "0.0.10" }
|
||||||
hex = "0.4.3"
|
hex = "0.4.3"
|
||||||
minicbor = { version = "0.18.0", features = ["std"] }
|
minicbor = { version = "0.17.1", features = ["std"] }
|
||||||
pallas-primitives = "0.12.0"
|
pallas-primitives = "0.12.0"
|
||||||
peg = "0.8.0"
|
peg = "0.8.0"
|
||||||
pretty = "0.11.3"
|
pretty = "0.11.3"
|
||||||
|
|
|
@ -6,3 +6,10 @@ pub mod machine;
|
||||||
pub mod parser;
|
pub mod parser;
|
||||||
mod pretty;
|
mod pretty;
|
||||||
pub mod program_builder;
|
pub mod program_builder;
|
||||||
|
|
||||||
|
pub use pallas_primitives::alonzo::PlutusData;
|
||||||
|
use pallas_primitives::Fragment;
|
||||||
|
|
||||||
|
pub fn plutus_data(bytes: &[u8]) -> PlutusData {
|
||||||
|
PlutusData::decode_fragment(bytes).unwrap()
|
||||||
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use std::rc::Rc;
|
use std::{collections::VecDeque, ops::Deref, rc::Rc};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ast::{Constant, NamedDeBruijn, Term, Type},
|
ast::{Constant, NamedDeBruijn, Term, Type},
|
||||||
|
@ -11,6 +11,7 @@ mod runtime;
|
||||||
|
|
||||||
use cost_model::{ExBudget, StepKind};
|
use cost_model::{ExBudget, StepKind};
|
||||||
pub use error::Error;
|
pub use error::Error;
|
||||||
|
use pallas_primitives::babbage::{BigInt, PlutusData};
|
||||||
|
|
||||||
use self::{cost_model::CostModel, runtime::BuiltinRuntime};
|
use self::{cost_model::CostModel, runtime::BuiltinRuntime};
|
||||||
|
|
||||||
|
@ -436,6 +437,7 @@ impl Value {
|
||||||
matches!(self, Value::Con(Constant::Bool(_)))
|
matches!(self, Value::Con(Constant::Bool(_)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Make this to_ex_mem not recursive.
|
||||||
pub fn to_ex_mem(&self) -> i64 {
|
pub fn to_ex_mem(&self) -> i64 {
|
||||||
match self {
|
match self {
|
||||||
Value::Con(c) => match c {
|
Value::Con(c) => match c {
|
||||||
|
@ -453,8 +455,10 @@ impl Value {
|
||||||
Constant::ProtoList(_, items) => items.iter().fold(0, |acc, constant| {
|
Constant::ProtoList(_, items) => items.iter().fold(0, |acc, constant| {
|
||||||
acc + Value::Con(constant.clone()).to_ex_mem()
|
acc + Value::Con(constant.clone()).to_ex_mem()
|
||||||
}),
|
}),
|
||||||
Constant::ProtoPair(_, _, _, _) => todo!(),
|
Constant::ProtoPair(_, _, l, r) => {
|
||||||
Constant::Data(_) => todo!(),
|
Value::Con(*l.clone()).to_ex_mem() + Value::Con(*r.clone()).to_ex_mem()
|
||||||
|
}
|
||||||
|
Constant::Data(item) => self.data_to_ex_mem(item),
|
||||||
},
|
},
|
||||||
Value::Delay(_, _) => 1,
|
Value::Delay(_, _) => 1,
|
||||||
Value::Lambda { .. } => 1,
|
Value::Lambda { .. } => 1,
|
||||||
|
@ -462,6 +466,70 @@ impl Value {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// I made data not recursive since data tends to be deeply nested
|
||||||
|
// thus causing a significant hit on performance
|
||||||
|
pub fn data_to_ex_mem(&self, data: &PlutusData) -> i64 {
|
||||||
|
let mut stack: VecDeque<&PlutusData> = VecDeque::new();
|
||||||
|
let mut total = 0;
|
||||||
|
stack.push_front(data);
|
||||||
|
while let Some(item) = stack.pop_front() {
|
||||||
|
// each time we deconstruct a data we add 4 memory units
|
||||||
|
total += 4;
|
||||||
|
match item {
|
||||||
|
PlutusData::Constr(c) => {
|
||||||
|
// note currently tag is not factored into cost of memory
|
||||||
|
// create new stack with of items from the list of data
|
||||||
|
let mut new_stack: VecDeque<&PlutusData> =
|
||||||
|
VecDeque::from_iter(c.fields.deref().iter());
|
||||||
|
// Append old stack to the back of the new stack
|
||||||
|
new_stack.append(&mut stack);
|
||||||
|
stack = new_stack;
|
||||||
|
}
|
||||||
|
PlutusData::Map(m) => {
|
||||||
|
let mut new_stack: VecDeque<&PlutusData>;
|
||||||
|
// create new stack with of items from the list of pairs of data
|
||||||
|
new_stack = m.deref().iter().fold(VecDeque::new(), |mut acc, d| {
|
||||||
|
acc.push_back(&d.0);
|
||||||
|
acc.push_back(&d.1);
|
||||||
|
acc
|
||||||
|
});
|
||||||
|
// Append old stack to the back of the new stack
|
||||||
|
new_stack.append(&mut stack);
|
||||||
|
stack = new_stack;
|
||||||
|
}
|
||||||
|
PlutusData::BigInt(i) => {
|
||||||
|
if let BigInt::Int(g) = i {
|
||||||
|
let numb: i64 = (*g).try_into().unwrap();
|
||||||
|
total += Value::Con(Constant::Integer(numb as isize)).to_ex_mem();
|
||||||
|
} else {
|
||||||
|
unreachable!()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
PlutusData::BoundedBytes(b) => {
|
||||||
|
let byte_string: Vec<u8> = b.deref().clone();
|
||||||
|
total += Value::Con(Constant::ByteString(byte_string)).to_ex_mem();
|
||||||
|
}
|
||||||
|
PlutusData::Array(a) => {
|
||||||
|
// create new stack with of items from the list of data
|
||||||
|
let mut new_stack: VecDeque<&PlutusData> =
|
||||||
|
VecDeque::from_iter(a.deref().iter());
|
||||||
|
// Append old stack to the back of the new stack
|
||||||
|
new_stack.append(&mut stack);
|
||||||
|
stack = new_stack;
|
||||||
|
}
|
||||||
|
PlutusData::ArrayIndef(a) => {
|
||||||
|
// create new stack with of items from the list of data
|
||||||
|
let mut new_stack: VecDeque<&PlutusData> =
|
||||||
|
VecDeque::from_iter(a.deref().iter());
|
||||||
|
// Append old stack to the back of the new stack
|
||||||
|
new_stack.append(&mut stack);
|
||||||
|
stack = new_stack;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
total
|
||||||
|
}
|
||||||
|
|
||||||
pub fn expect_type(&self, r#type: Type) -> Result<(), Error> {
|
pub fn expect_type(&self, r#type: Type) -> Result<(), Error> {
|
||||||
let constant: Constant = self.clone().try_into()?;
|
let constant: Constant = self.clone().try_into()?;
|
||||||
|
|
||||||
|
@ -522,7 +590,7 @@ impl From<&Constant> for Type {
|
||||||
Constant::ProtoPair(t1, t2, _, _) => {
|
Constant::ProtoPair(t1, t2, _, _) => {
|
||||||
Type::Pair(Box::new(t1.clone()), Box::new(t2.clone()))
|
Type::Pair(Box::new(t1.clone()), Box::new(t2.clone()))
|
||||||
}
|
}
|
||||||
Constant::Data(_) => todo!(),
|
Constant::Data(_) => Type::Data,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -825,7 +825,10 @@ impl BuiltinCosts {
|
||||||
DefaultFunction::ListData => todo!(),
|
DefaultFunction::ListData => todo!(),
|
||||||
DefaultFunction::IData => todo!(),
|
DefaultFunction::IData => todo!(),
|
||||||
DefaultFunction::BData => todo!(),
|
DefaultFunction::BData => todo!(),
|
||||||
DefaultFunction::UnConstrData => todo!(),
|
DefaultFunction::UnConstrData => ExBudget {
|
||||||
|
mem: self.un_constr_data.mem.cost(args[0].to_ex_mem()),
|
||||||
|
cpu: self.un_constr_data.cpu.cost(args[0].to_ex_mem()),
|
||||||
|
},
|
||||||
DefaultFunction::UnMapData => todo!(),
|
DefaultFunction::UnMapData => todo!(),
|
||||||
DefaultFunction::UnListData => todo!(),
|
DefaultFunction::UnListData => todo!(),
|
||||||
DefaultFunction::UnIData => todo!(),
|
DefaultFunction::UnIData => todo!(),
|
||||||
|
|
|
@ -1,3 +1,7 @@
|
||||||
|
use std::ops::Deref;
|
||||||
|
|
||||||
|
use pallas_primitives::babbage::PlutusData;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
ast::{Constant, Type},
|
ast::{Constant, Type},
|
||||||
builtins::DefaultFunction,
|
builtins::DefaultFunction,
|
||||||
|
@ -116,7 +120,7 @@ impl DefaultFunction {
|
||||||
DefaultFunction::ListData => todo!(),
|
DefaultFunction::ListData => todo!(),
|
||||||
DefaultFunction::IData => todo!(),
|
DefaultFunction::IData => todo!(),
|
||||||
DefaultFunction::BData => todo!(),
|
DefaultFunction::BData => todo!(),
|
||||||
DefaultFunction::UnConstrData => todo!(),
|
DefaultFunction::UnConstrData => 1,
|
||||||
DefaultFunction::UnMapData => todo!(),
|
DefaultFunction::UnMapData => todo!(),
|
||||||
DefaultFunction::UnListData => todo!(),
|
DefaultFunction::UnListData => todo!(),
|
||||||
DefaultFunction::UnIData => todo!(),
|
DefaultFunction::UnIData => todo!(),
|
||||||
|
@ -175,7 +179,7 @@ impl DefaultFunction {
|
||||||
DefaultFunction::ListData => todo!(),
|
DefaultFunction::ListData => todo!(),
|
||||||
DefaultFunction::IData => todo!(),
|
DefaultFunction::IData => todo!(),
|
||||||
DefaultFunction::BData => todo!(),
|
DefaultFunction::BData => todo!(),
|
||||||
DefaultFunction::UnConstrData => todo!(),
|
DefaultFunction::UnConstrData => 0,
|
||||||
DefaultFunction::UnMapData => todo!(),
|
DefaultFunction::UnMapData => todo!(),
|
||||||
DefaultFunction::UnListData => todo!(),
|
DefaultFunction::UnListData => todo!(),
|
||||||
DefaultFunction::UnIData => todo!(),
|
DefaultFunction::UnIData => todo!(),
|
||||||
|
@ -278,7 +282,7 @@ impl DefaultFunction {
|
||||||
DefaultFunction::ListData => todo!(),
|
DefaultFunction::ListData => todo!(),
|
||||||
DefaultFunction::IData => todo!(),
|
DefaultFunction::IData => todo!(),
|
||||||
DefaultFunction::BData => todo!(),
|
DefaultFunction::BData => todo!(),
|
||||||
DefaultFunction::UnConstrData => todo!(),
|
DefaultFunction::UnConstrData => arg.expect_type(Type::Data),
|
||||||
DefaultFunction::UnMapData => todo!(),
|
DefaultFunction::UnMapData => todo!(),
|
||||||
DefaultFunction::UnListData => todo!(),
|
DefaultFunction::UnListData => todo!(),
|
||||||
DefaultFunction::UnIData => todo!(),
|
DefaultFunction::UnIData => todo!(),
|
||||||
|
@ -625,7 +629,24 @@ impl DefaultFunction {
|
||||||
DefaultFunction::ListData => todo!(),
|
DefaultFunction::ListData => todo!(),
|
||||||
DefaultFunction::IData => todo!(),
|
DefaultFunction::IData => todo!(),
|
||||||
DefaultFunction::BData => todo!(),
|
DefaultFunction::BData => todo!(),
|
||||||
DefaultFunction::UnConstrData => todo!(),
|
DefaultFunction::UnConstrData => match &args[0] {
|
||||||
|
Value::Con(Constant::Data(PlutusData::Constr(c))) => {
|
||||||
|
Ok(Value::Con(Constant::ProtoPair(
|
||||||
|
Type::Integer,
|
||||||
|
Type::List(Box::new(Type::Data)),
|
||||||
|
Box::new(Constant::Integer(c.tag as isize)),
|
||||||
|
Box::new(Constant::ProtoList(
|
||||||
|
Type::Data,
|
||||||
|
c.fields
|
||||||
|
.deref()
|
||||||
|
.iter()
|
||||||
|
.map(|d| Constant::Data(d.clone()))
|
||||||
|
.collect(),
|
||||||
|
)),
|
||||||
|
)))
|
||||||
|
}
|
||||||
|
_ => unreachable!(),
|
||||||
|
},
|
||||||
DefaultFunction::UnMapData => todo!(),
|
DefaultFunction::UnMapData => todo!(),
|
||||||
DefaultFunction::UnListData => todo!(),
|
DefaultFunction::UnListData => todo!(),
|
||||||
DefaultFunction::UnIData => todo!(),
|
DefaultFunction::UnIData => todo!(),
|
||||||
|
|
|
@ -185,7 +185,22 @@ impl Constant {
|
||||||
RcDoc::text(","),
|
RcDoc::text(","),
|
||||||
))
|
))
|
||||||
.append(RcDoc::text("]")),
|
.append(RcDoc::text("]")),
|
||||||
Constant::ProtoPair(_, _, _, _) => todo!(),
|
Constant::ProtoPair(r#type1, r#type2, left, right) => RcDoc::text("(")
|
||||||
|
.append(
|
||||||
|
RcDoc::text("pair")
|
||||||
|
.append(RcDoc::line())
|
||||||
|
.append(r#type1.to_doc())
|
||||||
|
.append(RcDoc::line())
|
||||||
|
.append(r#type2.to_doc()),
|
||||||
|
)
|
||||||
|
.append(RcDoc::line_())
|
||||||
|
.append(RcDoc::text(")"))
|
||||||
|
.append(RcDoc::line())
|
||||||
|
.append(RcDoc::text("("))
|
||||||
|
.append(left.to_doc_list())
|
||||||
|
.append(RcDoc::text(","))
|
||||||
|
.append(right.to_doc_list())
|
||||||
|
.append(RcDoc::text(")")),
|
||||||
Constant::Data(_) => todo!(),
|
Constant::Data(_) => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -206,7 +221,7 @@ impl Constant {
|
||||||
))
|
))
|
||||||
.append(RcDoc::text("]")),
|
.append(RcDoc::text("]")),
|
||||||
Constant::ProtoPair(_, _, _, _) => todo!(),
|
Constant::ProtoPair(_, _, _, _) => todo!(),
|
||||||
Constant::Data(_) => todo!(),
|
Constant::Data(data) => RcDoc::text("todo"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -228,7 +243,7 @@ impl Type {
|
||||||
.append(RcDoc::line_())
|
.append(RcDoc::line_())
|
||||||
.append(RcDoc::text(")")),
|
.append(RcDoc::text(")")),
|
||||||
Type::Pair(_, _) => todo!(),
|
Type::Pair(_, _) => todo!(),
|
||||||
Type::Data => todo!(),
|
Type::Data => RcDoc::text("data"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue