forked from M-Labs/nac3
implement timeline functions for RISC-V (WIP)
This commit is contained in:
parent
3dd916b6ac
commit
ba93931758
|
@ -21,7 +21,7 @@ use parking_lot::RwLock;
|
||||||
use nac3core::{
|
use nac3core::{
|
||||||
codegen::{CodeGenTask, WithCall, WorkerRegistry},
|
codegen::{CodeGenTask, WithCall, WorkerRegistry},
|
||||||
symbol_resolver::SymbolResolver,
|
symbol_resolver::SymbolResolver,
|
||||||
toplevel::{composer::TopLevelComposer, TopLevelContext, TopLevelDef},
|
toplevel::{composer::TopLevelComposer, TopLevelContext, TopLevelDef, GenCall},
|
||||||
typecheck::typedef::{FunSignature, FuncArg},
|
typecheck::typedef::{FunSignature, FuncArg},
|
||||||
};
|
};
|
||||||
use nac3core::{
|
use nac3core::{
|
||||||
|
@ -33,7 +33,7 @@ use crate::symbol_resolver::Resolver;
|
||||||
|
|
||||||
mod symbol_resolver;
|
mod symbol_resolver;
|
||||||
|
|
||||||
#[derive(Clone, Copy)]
|
#[derive(PartialEq, Clone, Copy)]
|
||||||
enum Isa {
|
enum Isa {
|
||||||
RiscV,
|
RiscV,
|
||||||
CortexA9,
|
CortexA9,
|
||||||
|
@ -171,18 +171,57 @@ impl Nac3 {
|
||||||
_ => return Err(exceptions::PyValueError::new_err("invalid ISA")),
|
_ => return Err(exceptions::PyValueError::new_err("invalid ISA")),
|
||||||
};
|
};
|
||||||
let primitive: PrimitiveStore = TopLevelComposer::make_primitives().0;
|
let primitive: PrimitiveStore = TopLevelComposer::make_primitives().0;
|
||||||
let (composer, builtins_def, builtins_ty) = TopLevelComposer::new(vec![(
|
let mut builtins = vec![];
|
||||||
"output_int".into(),
|
if isa == Isa::RiscV {
|
||||||
FunSignature {
|
builtins.push((
|
||||||
args: vec![FuncArg {
|
"now_mu".into(),
|
||||||
name: "x".into(),
|
FunSignature {
|
||||||
ty: primitive.int32,
|
args: vec![],
|
||||||
default_value: None,
|
ret: primitive.int64,
|
||||||
}],
|
vars: HashMap::new(),
|
||||||
ret: primitive.none,
|
},
|
||||||
vars: HashMap::new(),
|
Arc::new(GenCall::new(Box::new(
|
||||||
},
|
|ctx, _, fun, args| {
|
||||||
)]);
|
unimplemented!();
|
||||||
|
}
|
||||||
|
)))
|
||||||
|
));
|
||||||
|
builtins.push((
|
||||||
|
"at_mu".into(),
|
||||||
|
FunSignature {
|
||||||
|
args: vec![FuncArg {
|
||||||
|
name: "t".into(),
|
||||||
|
ty: primitive.int64,
|
||||||
|
default_value: None,
|
||||||
|
}],
|
||||||
|
ret: primitive.none,
|
||||||
|
vars: HashMap::new(),
|
||||||
|
},
|
||||||
|
Arc::new(GenCall::new(Box::new(
|
||||||
|
|ctx, _, fun, args| {
|
||||||
|
unimplemented!();
|
||||||
|
}
|
||||||
|
)))
|
||||||
|
));
|
||||||
|
builtins.push((
|
||||||
|
"delay_mu".into(),
|
||||||
|
FunSignature {
|
||||||
|
args: vec![FuncArg {
|
||||||
|
name: "dt".into(),
|
||||||
|
ty: primitive.int64,
|
||||||
|
default_value: None,
|
||||||
|
}],
|
||||||
|
ret: primitive.none,
|
||||||
|
vars: HashMap::new(),
|
||||||
|
},
|
||||||
|
Arc::new(GenCall::new(Box::new(
|
||||||
|
|ctx, _, fun, args| {
|
||||||
|
unimplemented!();
|
||||||
|
}
|
||||||
|
)))
|
||||||
|
));
|
||||||
|
}
|
||||||
|
let (composer, builtins_def, builtins_ty) = TopLevelComposer::new(builtins);
|
||||||
Ok(Nac3 {
|
Ok(Nac3 {
|
||||||
isa,
|
isa,
|
||||||
primitive,
|
primitive,
|
||||||
|
|
|
@ -34,7 +34,7 @@ impl TopLevelComposer {
|
||||||
/// return a composer and things to make a "primitive" symbol resolver, so that the symbol
|
/// return a composer and things to make a "primitive" symbol resolver, so that the symbol
|
||||||
/// resolver can later figure out primitive type definitions when passed a primitive type name
|
/// resolver can later figure out primitive type definitions when passed a primitive type name
|
||||||
pub fn new(
|
pub fn new(
|
||||||
builtins: Vec<(StrRef, FunSignature)>,
|
builtins: Vec<(StrRef, FunSignature, Arc<GenCall>)>,
|
||||||
) -> (Self, HashMap<StrRef, DefinitionId>, HashMap<StrRef, Type>) {
|
) -> (Self, HashMap<StrRef, DefinitionId>, HashMap<StrRef, Type>) {
|
||||||
let mut primitives = Self::make_primitives();
|
let mut primitives = Self::make_primitives();
|
||||||
|
|
||||||
|
@ -311,7 +311,7 @@ impl TopLevelComposer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (name, sig) in builtins {
|
for (name, sig, codegen_callback) in builtins {
|
||||||
let fun_sig = unifier.add_ty(TypeEnum::TFunc(RefCell::new(sig)));
|
let fun_sig = unifier.add_ty(TypeEnum::TFunc(RefCell::new(sig)));
|
||||||
built_in_ty.insert(name, fun_sig);
|
built_in_ty.insert(name, fun_sig);
|
||||||
built_in_id.insert(name, DefinitionId(definition_ast_list.len()));
|
built_in_id.insert(name, DefinitionId(definition_ast_list.len()));
|
||||||
|
@ -320,11 +320,11 @@ impl TopLevelComposer {
|
||||||
name: name.into(),
|
name: name.into(),
|
||||||
simple_name: name,
|
simple_name: name,
|
||||||
signature: fun_sig,
|
signature: fun_sig,
|
||||||
instance_to_stmt: HashMap::new(),
|
instance_to_stmt: Default::default(),
|
||||||
instance_to_symbol: [("".into(), name.into())].iter().cloned().collect(),
|
instance_to_symbol: Default::default(),
|
||||||
var_id: Default::default(),
|
var_id: Default::default(),
|
||||||
resolver: None,
|
resolver: None,
|
||||||
codegen_callback: None,
|
codegen_callback: Some(codegen_callback),
|
||||||
})),
|
})),
|
||||||
None,
|
None,
|
||||||
));
|
));
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
@extern
|
||||||
|
def output_int(x: int32):
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
class A:
|
class A:
|
||||||
a: int32
|
a: int32
|
||||||
b: B
|
b: B
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
@extern
|
||||||
|
def output_asciiart(x: int32):
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
def run() -> int32:
|
def run() -> int32:
|
||||||
minX = -2.0
|
minX = -2.0
|
||||||
maxX = 1.0
|
maxX = 1.0
|
||||||
|
|
|
@ -9,7 +9,7 @@ use nac3core::{
|
||||||
codegen::{CodeGenTask, WithCall, WorkerRegistry},
|
codegen::{CodeGenTask, WithCall, WorkerRegistry},
|
||||||
symbol_resolver::SymbolResolver,
|
symbol_resolver::SymbolResolver,
|
||||||
toplevel::{composer::TopLevelComposer, TopLevelDef},
|
toplevel::{composer::TopLevelComposer, TopLevelDef},
|
||||||
typecheck::typedef::{FunSignature, FuncArg},
|
typecheck::typedef::FunSignature,
|
||||||
};
|
};
|
||||||
|
|
||||||
mod basic_symbol_resolver;
|
mod basic_symbol_resolver;
|
||||||
|
@ -32,26 +32,7 @@ fn main() {
|
||||||
};
|
};
|
||||||
|
|
||||||
let primitive: PrimitiveStore = TopLevelComposer::make_primitives().0;
|
let primitive: PrimitiveStore = TopLevelComposer::make_primitives().0;
|
||||||
let (mut composer, builtins_def, builtins_ty) = TopLevelComposer::new(vec![
|
let (mut composer, builtins_def, builtins_ty) = TopLevelComposer::new(vec![]);
|
||||||
("output_int".into(), FunSignature {
|
|
||||||
args: vec![FuncArg {
|
|
||||||
name: "x".into(),
|
|
||||||
ty: primitive.int32,
|
|
||||||
default_value: None,
|
|
||||||
}],
|
|
||||||
ret: primitive.none,
|
|
||||||
vars: HashMap::new(),
|
|
||||||
}),
|
|
||||||
("output_asciiart".into(), FunSignature {
|
|
||||||
args: vec![FuncArg {
|
|
||||||
name: "x".into(),
|
|
||||||
ty: primitive.int32,
|
|
||||||
default_value: None,
|
|
||||||
}],
|
|
||||||
ret: primitive.none,
|
|
||||||
vars: HashMap::new(),
|
|
||||||
})
|
|
||||||
]);
|
|
||||||
|
|
||||||
let internal_resolver: Arc<ResolverInternal> = ResolverInternal {
|
let internal_resolver: Arc<ResolverInternal> = ResolverInternal {
|
||||||
id_to_type: builtins_ty.into(),
|
id_to_type: builtins_ty.into(),
|
||||||
|
|
Loading…
Reference in New Issue