forked from M-Labs/nac3
Compare commits
1 Commits
master
...
refactor_c
Author | SHA1 | Date |
---|---|---|
abdul124 | 92c9919948 |
|
@ -180,7 +180,9 @@
|
||||||
clippy
|
clippy
|
||||||
pre-commit
|
pre-commit
|
||||||
rustfmt
|
rustfmt
|
||||||
|
rust-analyzer
|
||||||
];
|
];
|
||||||
|
RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}";
|
||||||
shellHook =
|
shellHook =
|
||||||
''
|
''
|
||||||
export DEMO_LINALG_STUB=${packages.x86_64-linux.demo-linalg-stub}/lib/liblinalg.a
|
export DEMO_LINALG_STUB=${packages.x86_64-linux.demo-linalg-stub}/lib/liblinalg.a
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -1,26 +1,87 @@
|
||||||
from min_artiq import *
|
from min_artiq import *
|
||||||
|
from numpy import int32
|
||||||
|
|
||||||
|
|
||||||
|
# @nac3
|
||||||
|
# class A:
|
||||||
|
# a: int32
|
||||||
|
# core: KernelInvariant[Core]
|
||||||
|
|
||||||
|
# def __init__(self, a: int32):
|
||||||
|
# self.core = Core()
|
||||||
|
# self.a = a
|
||||||
|
|
||||||
|
# @kernel
|
||||||
|
# def output_all_fields(self):
|
||||||
|
# #print(self.a)
|
||||||
|
# pass
|
||||||
|
|
||||||
|
# @kernel
|
||||||
|
# def set_a(self, a: int32):
|
||||||
|
# self.a = a
|
||||||
|
|
||||||
|
# @nac3
|
||||||
|
# class B(A):
|
||||||
|
# b: int32
|
||||||
|
|
||||||
|
# def __init__(self, b: int32):
|
||||||
|
# # A.__init__(self, b + 1)
|
||||||
|
# self.core = Core()
|
||||||
|
# self.a = b
|
||||||
|
# self.b = b
|
||||||
|
# self.set_b(b)
|
||||||
|
|
||||||
|
# @kernel
|
||||||
|
# def output_parent_fields(self):
|
||||||
|
# # A.output_all_fields(self)
|
||||||
|
# pass
|
||||||
|
|
||||||
|
# @kernel
|
||||||
|
# def output_all_fields(self):
|
||||||
|
# # A.output_all_fields(self)
|
||||||
|
# pass
|
||||||
|
# #print(self.b)
|
||||||
|
|
||||||
|
# @kernel
|
||||||
|
# def set_b(self, b: int32):
|
||||||
|
# self.b = b
|
||||||
|
|
||||||
@nac3
|
@nac3
|
||||||
class Demo:
|
class C:
|
||||||
|
c: Kernel[int32]
|
||||||
|
a: Kernel[int32]
|
||||||
|
b: Kernel[int32]
|
||||||
core: KernelInvariant[Core]
|
core: KernelInvariant[Core]
|
||||||
led0: KernelInvariant[TTLOut]
|
|
||||||
led1: KernelInvariant[TTLOut]
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, c: int32):
|
||||||
|
# B.__init__(self, c + 1)
|
||||||
self.core = Core()
|
self.core = Core()
|
||||||
self.led0 = TTLOut(self.core, 18)
|
self.a = c
|
||||||
self.led1 = TTLOut(self.core, 19)
|
self.b = c
|
||||||
|
self.c = c
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def output_parent_fields(self):
|
||||||
|
# B.output_all_fields(self)
|
||||||
|
pass
|
||||||
|
|
||||||
@kernel
|
@kernel
|
||||||
def run(self):
|
def output_all_fields(self):
|
||||||
self.core.reset()
|
# B.output_all_fields(self)
|
||||||
while True:
|
#print(self.c)
|
||||||
with parallel:
|
pass
|
||||||
self.led0.pulse(100.*ms)
|
|
||||||
self.led1.pulse(100.*ms)
|
|
||||||
self.core.delay(100.*ms)
|
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def set_c(self, c: int32):
|
||||||
|
self.c = c
|
||||||
|
|
||||||
|
@kernel
|
||||||
|
def run(self):
|
||||||
|
self.output_all_fields()
|
||||||
|
# self.set_a(1)
|
||||||
|
# self.set_b(2)
|
||||||
|
self.set_c(3)
|
||||||
|
self.output_all_fields()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
Demo().run()
|
C(10).run()
|
||||||
|
|
Binary file not shown.
|
@ -439,6 +439,9 @@ pub fn parse_type_annotation<T>(
|
||||||
} else {
|
} else {
|
||||||
let obj_id = resolver.get_identifier_def(*id);
|
let obj_id = resolver.get_identifier_def(*id);
|
||||||
if let Ok(obj_id) = obj_id {
|
if let Ok(obj_id) = obj_id {
|
||||||
|
// let Some(top_level_def) = top_level_defs.get(obj_id.0) else {
|
||||||
|
// return Err( HashSet::from([format!("Name Error undefined name {id} (at {})", expr.location),]));
|
||||||
|
// };
|
||||||
let def = top_level_defs[obj_id.0].read();
|
let def = top_level_defs[obj_id.0].read();
|
||||||
if let TopLevelDef::Class { fields, methods, type_vars, .. } = &*def {
|
if let TopLevelDef::Class { fields, methods, type_vars, .. } = &*def {
|
||||||
if !type_vars.is_empty() {
|
if !type_vars.is_empty() {
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -685,6 +685,16 @@ impl TopLevelComposer {
|
||||||
let this = this.as_ref();
|
let this = this.as_ref();
|
||||||
let other = unifier.get_ty(other);
|
let other = unifier.get_ty(other);
|
||||||
let other = other.as_ref();
|
let other = other.as_ref();
|
||||||
|
println!("Type of this was: {}", this.get_type_name());
|
||||||
|
println!("Type of other was: {}", other.get_type_name());
|
||||||
|
if let TypeEnum::TVar { name, .. } = other {
|
||||||
|
if name.is_some(){
|
||||||
|
println!("Name of other was {}", name.unwrap());
|
||||||
|
}else {
|
||||||
|
println!("Name of other was None");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
let (
|
let (
|
||||||
TypeEnum::TFunc(FunSignature { args: this_args, ret: this_ret, .. }),
|
TypeEnum::TFunc(FunSignature { args: this_args, ret: this_ret, .. }),
|
||||||
TypeEnum::TFunc(FunSignature { args: other_args, ret: other_ret, .. }),
|
TypeEnum::TFunc(FunSignature { args: other_args, ret: other_ret, .. }),
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
---
|
||||||
|
source: nac3core/src/toplevel/test.rs
|
||||||
|
assertion_line: 576
|
||||||
|
expression: res_vec
|
||||||
|
|
||||||
|
---
|
||||||
|
[
|
||||||
|
"Class {\nname: \"A\",\nancestors: [\"class_def_104\"],\nfields: [],\nmethods: [(\"__init__\", \"fn[[], 4]\")],\ntype_vars: []\n}\n",
|
||||||
|
"Function {\nname: \"A.__init__\",\nsig: \"fn[[], 4]\",\nvar_id: []\n}\n",
|
||||||
|
"Class {\nname: \"B\",\nancestors: [\"class_def_106[typevar230, typevar229]\"],\nfields: [],\nmethods: [(\"__init__\", \"fn[[], 4]\")],\ntype_vars: [\"typevar230\", \"typevar229\"]\n}\n",
|
||||||
|
"Function {\nname: \"B.__init__\",\nsig: \"fn[[], 4]\",\nvar_id: []\n}\n",
|
||||||
|
"Class {\nname: \"C\",\nancestors: [\"class_def_108[typevar229]\", \"class_def_104\"],\nfields: [],\nmethods: [(\"__init__\", \"fn[[], 4]\")],\ntype_vars: [\"typevar229\"]\n}\n",
|
||||||
|
"Function {\nname: \"C.__init__\",\nsig: \"fn[[], 4]\",\nvar_id: []\n}\n",
|
||||||
|
]
|
|
@ -0,0 +1,17 @@
|
||||||
|
---
|
||||||
|
source: nac3core/src/toplevel/test.rs
|
||||||
|
assertion_line: 576
|
||||||
|
expression: res_vec
|
||||||
|
|
||||||
|
---
|
||||||
|
[
|
||||||
|
"Class {\nname: \"A\",\nancestors: [\"class_def_104[T]\"],\nfields: [\"a\", \"b\", \"c\"],\nmethods: [(\"__init__\", \"fn[[t:T], 4]\"), (\"fun\", \"fn[[a:0, b:T], 11[virtual[108[3]]]]\"), (\"foo\", \"fn[[c:111], 4]\")],\ntype_vars: [\"T\"]\n}\n",
|
||||||
|
"Function {\nname: \"A.__init__\",\nsig: \"fn[[t:T], 4]\",\nvar_id: []\n}\n",
|
||||||
|
"Function {\nname: \"A.fun\",\nsig: \"fn[[a:0, b:T], 11[virtual[108[3]]]]\",\nvar_id: []\n}\n",
|
||||||
|
"Function {\nname: \"A.foo\",\nsig: \"fn[[c:111], 4]\",\nvar_id: []\n}\n",
|
||||||
|
"Class {\nname: \"B\",\nancestors: [\"class_def_108[typevar230]\", \"class_def_104[2]\"],\nfields: [\"a\", \"b\", \"c\", \"d\"],\nmethods: [(\"__init__\", \"fn[[], 4]\"), (\"fun\", \"fn[[a:0, b:T], 11[virtual[108[3]]]]\"), (\"foo\", \"fn[[c:111], 4]\")],\ntype_vars: [\"typevar230\"]\n}\n",
|
||||||
|
"Function {\nname: \"B.__init__\",\nsig: \"fn[[], 4]\",\nvar_id: []\n}\n",
|
||||||
|
"Function {\nname: \"B.fun\",\nsig: \"fn[[a:0, b:T], 11[virtual[108[3]]]]\",\nvar_id: []\n}\n",
|
||||||
|
"Class {\nname: \"C\",\nancestors: [\"class_def_111\", \"class_def_108[3]\", \"class_def_104[2]\"],\nfields: [\"a\", \"b\", \"c\", \"d\", \"e\"],\nmethods: [(\"__init__\", \"fn[[], 4]\"), (\"fun\", \"fn[[a:0, b:T], 11[virtual[108[3]]]]\"), (\"foo\", \"fn[[c:111], 4]\")],\ntype_vars: []\n}\n",
|
||||||
|
"Function {\nname: \"C.__init__\",\nsig: \"fn[[], 4]\",\nvar_id: []\n}\n",
|
||||||
|
]
|
|
@ -0,0 +1,15 @@
|
||||||
|
---
|
||||||
|
source: nac3core/src/toplevel/test.rs
|
||||||
|
assertion_line: 576
|
||||||
|
expression: res_vec
|
||||||
|
|
||||||
|
---
|
||||||
|
[
|
||||||
|
"Function {\nname: \"foo\",\nsig: \"fn[[a:11[0], b:tuple[T, 2]], 105[109, 3]]\",\nvar_id: []\n}\n",
|
||||||
|
"Class {\nname: \"A\",\nancestors: [\"class_def_105[T, V]\"],\nfields: [\"a\", \"b\"],\nmethods: [(\"__init__\", \"fn[[v:V], 4]\"), (\"fun\", \"fn[[a:T], V]\")],\ntype_vars: [\"T\", \"V\"]\n}\n",
|
||||||
|
"Function {\nname: \"A.__init__\",\nsig: \"fn[[v:V], 4]\",\nvar_id: [TypeVarId(243)]\n}\n",
|
||||||
|
"Function {\nname: \"A.fun\",\nsig: \"fn[[a:T], V]\",\nvar_id: [TypeVarId(248)]\n}\n",
|
||||||
|
"Function {\nname: \"gfun\",\nsig: \"fn[[a:105[11[2], 0]], 4]\",\nvar_id: []\n}\n",
|
||||||
|
"Class {\nname: \"B\",\nancestors: [\"class_def_109\"],\nfields: [],\nmethods: [(\"__init__\", \"fn[[], 4]\")],\ntype_vars: []\n}\n",
|
||||||
|
"Function {\nname: \"B.__init__\",\nsig: \"fn[[], 4]\",\nvar_id: []\n}\n",
|
||||||
|
]
|
|
@ -0,0 +1,15 @@
|
||||||
|
---
|
||||||
|
source: nac3core/src/toplevel/test.rs
|
||||||
|
assertion_line: 576
|
||||||
|
expression: res_vec
|
||||||
|
|
||||||
|
---
|
||||||
|
[
|
||||||
|
"Class {\nname: \"A\",\nancestors: [\"class_def_104[typevar229, typevar230]\"],\nfields: [\"a\", \"b\"],\nmethods: [(\"__init__\", \"fn[[a:104[2, 3], b:107], 4]\"), (\"fun\", \"fn[[a:104[2, 3]], 104[3, 0]]\")],\ntype_vars: [\"typevar229\", \"typevar230\"]\n}\n",
|
||||||
|
"Function {\nname: \"A.__init__\",\nsig: \"fn[[a:104[2, 3], b:107], 4]\",\nvar_id: []\n}\n",
|
||||||
|
"Function {\nname: \"A.fun\",\nsig: \"fn[[a:104[2, 3]], 104[3, 0]]\",\nvar_id: []\n}\n",
|
||||||
|
"Class {\nname: \"B\",\nancestors: [\"class_def_107\", \"class_def_104[1, 3]\"],\nfields: [\"a\", \"b\"],\nmethods: [(\"__init__\", \"fn[[], 4]\"), (\"fun\", \"fn[[a:104[2, 3]], 104[3, 0]]\"), (\"foo\", \"fn[[b:107], 107]\"), (\"bar\", \"fn[[a:104[11[107], 0]], tuple[104[virtual[104[107, 0]], 3], 107]]\")],\ntype_vars: []\n}\n",
|
||||||
|
"Function {\nname: \"B.__init__\",\nsig: \"fn[[], 4]\",\nvar_id: []\n}\n",
|
||||||
|
"Function {\nname: \"B.foo\",\nsig: \"fn[[b:107], 107]\",\nvar_id: []\n}\n",
|
||||||
|
"Function {\nname: \"B.bar\",\nsig: \"fn[[a:104[11[107], 0]], tuple[104[virtual[104[107, 0]], 3], 107]]\",\nvar_id: []\n}\n",
|
||||||
|
]
|
|
@ -0,0 +1,9 @@
|
||||||
|
---
|
||||||
|
source: nac3core/src/toplevel/test.rs
|
||||||
|
assertion_line: 576
|
||||||
|
expression: res_vec
|
||||||
|
|
||||||
|
---
|
||||||
|
[
|
||||||
|
"Class {\nname: \"A\",\nancestors: [\"class_def_104\"],\nfields: [],\nmethods: [],\ntype_vars: []\n}\n",
|
||||||
|
]
|
|
@ -521,7 +521,7 @@ fn test_simple_function_analyze(source: &[&str], tys: &[&str], names: &[&str]) {
|
||||||
"class same name"
|
"class same name"
|
||||||
)]
|
)]
|
||||||
fn test_analyze(source: &[&str], res: &[&str]) {
|
fn test_analyze(source: &[&str], res: &[&str]) {
|
||||||
let print = false;
|
let print = true;
|
||||||
let mut composer =
|
let mut composer =
|
||||||
TopLevelComposer::new(Vec::new(), Vec::new(), ComposerConfig::default(), 64).0;
|
TopLevelComposer::new(Vec::new(), Vec::new(), ComposerConfig::default(), 64).0;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::symbol_resolver::SymbolValue;
|
use crate::symbol_resolver::SymbolValue;
|
||||||
use crate::toplevel::helper::{PrimDef, PrimDefDetails};
|
use crate::toplevel::helper::{PrimDef, PrimDefDetails};
|
||||||
|
use crate::typecheck::type_inferencer::report_error;
|
||||||
use crate::typecheck::typedef::VarMap;
|
use crate::typecheck::typedef::VarMap;
|
||||||
use nac3parser::ast::Constant;
|
use nac3parser::ast::Constant;
|
||||||
use strum::IntoEnumIterator;
|
use strum::IntoEnumIterator;
|
||||||
|
@ -97,7 +98,13 @@ pub fn parse_ast_to_type_annotation_kinds<T, S: std::hash::BuildHasher + Clone>(
|
||||||
Ok(TypeAnnotation::CustomClass { id: PrimDef::Exception.id(), params: Vec::default() })
|
Ok(TypeAnnotation::CustomClass { id: PrimDef::Exception.id(), params: Vec::default() })
|
||||||
} else if let Ok(obj_id) = resolver.get_identifier_def(*id) {
|
} else if let Ok(obj_id) = resolver.get_identifier_def(*id) {
|
||||||
let type_vars = {
|
let type_vars = {
|
||||||
let def_read = top_level_defs[obj_id.0].try_read();
|
let Some(top_level_def) = top_level_defs.get(obj_id.0) else {
|
||||||
|
return report_error(
|
||||||
|
format!("Name Error undefined name {id}").as_str(),
|
||||||
|
expr.location,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
let def_read = top_level_def.try_read();
|
||||||
if let Some(def_read) = def_read {
|
if let Some(def_read) = def_read {
|
||||||
if let TopLevelDef::Class { type_vars, .. } = &*def_read {
|
if let TopLevelDef::Class { type_vars, .. } = &*def_read {
|
||||||
type_vars.clone()
|
type_vars.clone()
|
||||||
|
@ -152,12 +159,19 @@ pub fn parse_ast_to_type_annotation_kinds<T, S: std::hash::BuildHasher + Clone>(
|
||||||
}
|
}
|
||||||
let obj_id = resolver.get_identifier_def(*id)?;
|
let obj_id = resolver.get_identifier_def(*id)?;
|
||||||
let type_vars = {
|
let type_vars = {
|
||||||
let def_read = top_level_defs[obj_id.0].try_read();
|
println!("Executing Type Var");
|
||||||
|
let Some(top_level_def) = top_level_defs.get(obj_id.0) else {
|
||||||
|
return report_error(
|
||||||
|
format!("Name Error undefined name {id}").as_str(),
|
||||||
|
expr.location,
|
||||||
|
);
|
||||||
|
};
|
||||||
|
let def_read = top_level_def.try_read();
|
||||||
if let Some(def_read) = def_read {
|
if let Some(def_read) = def_read {
|
||||||
let TopLevelDef::Class { type_vars, .. } = &*def_read else {
|
let TopLevelDef::Class { type_vars, name, .. } = &*def_read else {
|
||||||
unreachable!("must be class here")
|
unreachable!("must be class here")
|
||||||
};
|
};
|
||||||
|
println!("class has name: {name}");
|
||||||
type_vars.clone()
|
type_vars.clone()
|
||||||
} else {
|
} else {
|
||||||
locked.get(&obj_id).unwrap().clone()
|
locked.get(&obj_id).unwrap().clone()
|
||||||
|
|
|
@ -114,7 +114,7 @@ impl Fold<()> for NaiveFolder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn report_error<T>(msg: &str, location: Location) -> Result<T, InferenceError> {
|
pub fn report_error<T>(msg: &str, location: Location) -> Result<T, InferenceError> {
|
||||||
Err(HashSet::from([format!("{msg} at {location}")]))
|
Err(HashSet::from([format!("{msg} at {location}")]))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
123
|
|
@ -0,0 +1,34 @@
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
|
||||||
|
T = TypeVar("T")
|
||||||
|
V = TypeVar("V")
|
||||||
|
|
||||||
|
class A(Generic[T]):
|
||||||
|
a: int32
|
||||||
|
b: T
|
||||||
|
c: A[int64]
|
||||||
|
def __init__(self, t: T):
|
||||||
|
self.a = 3
|
||||||
|
self.b = T
|
||||||
|
def fun(self, a: int32, b: T) -> list[virtual[B[bool]]]:
|
||||||
|
pass
|
||||||
|
def foo(self, c: C):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class B(Generic[V], A[float]):
|
||||||
|
d: C
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
def fun(self, a: int32, b: T) -> list[virtual[B[bool]]]:
|
||||||
|
# override
|
||||||
|
pass
|
||||||
|
|
||||||
|
class C(B[bool]):
|
||||||
|
e: int64
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def run() -> int32:
|
||||||
|
|
||||||
|
return 0
|
|
@ -4,7 +4,7 @@ from __future__ import annotations
|
||||||
def output_int32(a: int32):
|
def output_int32(a: int32):
|
||||||
...
|
...
|
||||||
|
|
||||||
class A:
|
class A(B):
|
||||||
d: int32
|
d: int32
|
||||||
a: list[B]
|
a: list[B]
|
||||||
def __init__(self, b: list[B]):
|
def __init__(self, b: list[B]):
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue