MimIR 0.1
MimIR is my Intermediate Representation
Loading...
Searching...
No Matches
ds2cps.cpp
Go to the documentation of this file.
2
3#include <mim/lam.h>
4#include <mim/world.h>
5
7
8namespace mim::plug::direct {
9
10const Def* DS2CPS::rewrite_imm_App(const App* app) {
11 if (auto lam = app->callee()->isa_mut<Lam>()) {
12 auto new_lam = rewrite_lam(lam);
13 if (new_lam != lam) {
14 DLOG("new lam: {} : {}", new_lam, new_lam->type());
15 DLOG("arg: {} : {}", app->arg(), app->arg()->type());
16 auto new_app = new_world().app(new_lam, rewrite(app->arg()));
17 DLOG("new app: {} : {}", new_app, new_app->type());
18 return new_app;
19 }
20 }
21
22 return Rewriter::rewrite_imm_App(app);
23}
24
25/// This function generates the cps function `f_cps : Cn [a: A, Cn B]` for a ds function `f: [a : A] -> B`.
26/// The translation is associated in the `rewritten_` map.
27const Def* DS2CPS::rewrite_lam(Lam* lam) {
28 if (auto i = rewritten_.find(lam); i != rewritten_.end()) return i->second;
29
30 auto pi = lam->type();
31 auto dom = pi->dom();
32 auto codom = pi->codom();
33
34 if (Lam::isa_cn(lam)) return rewrite(lam); // only look at lambdas (ds not cps)
35 if (codom->isa<Type>()) return rewrite(lam); // ignore ds on type level
36 if (codom->isa<Pi>()) return rewrite(lam); // ignore higher order function
37
38 DLOG("rewrite DS function {} : {}", lam, lam->type());
39
40 auto sigma = new_world().mut_sigma(2);
41 auto rw_codom = codom;
42
43 // replace ds dom var with cps sigma var (cps dom)
44 if (auto var = pi->has_var()) {
45 push();
46 map(var, sigma->var(2, 0));
47 rw_codom = rewrite(codom);
48 pop();
49 }
50
51 sigma->set(0, dom);
52 sigma->set(1, new_world().cn(rw_codom));
53
54 DLOG("original codom: {}", codom);
55 DLOG("rewritten codom: {}", rw_codom);
56
57 auto cps_lam = new_world().mut_con(sigma)->set(lam->dbg());
58 cps_lam->debug_suffix("_cps");
59 auto [filter, cps_body] = lam->reduce<2>(cps_lam->var(2, 0));
60
61 // rewrite vars of new function
62 // calls handled separately
63 DLOG("body: {} : {}", lam->body(), lam->body()->type());
64 DLOG("cps body: {} : {}", cps_body, cps_body->type());
65
66 cps_lam->app(filter, cps_lam->vars().back(), cps_body);
67
68 rewritten_[lam] = op_cps2ds_dep(cps_lam);
69 DLOG("replace {} : {}", lam, lam->type());
70 DLOG("with {} : {}", rewritten_[lam], rewritten_[lam]->type());
71
72 return rewritten_[lam];
73}
74
75} // namespace mim::plug::direct
const Def * callee() const
Definition lam.h:276
const Def * arg() const
Definition lam.h:285
Base class for all Defs.
Definition def.h:251
T * isa_mut() const
If this is mutable, it will cast constness away and perform a dynamic_cast to T.
Definition def.h:486
const Def * debug_suffix(std::string) const
Definition def.cpp:499
const Def * type() const noexcept
Yields the "raw" type of this Def (maybe nullptr).
Definition def.cpp:446
Dbg dbg() const
Definition def.h:506
A function.
Definition lam.h:110
static const Lam * isa_cn(const Def *d)
Definition lam.h:141
Lam * set(Filter filter, const Def *body)
Definition lam.cpp:29
Defs reduce(Defs) const
Definition lam.cpp:39
const Pi * type() const
Definition lam.h:130
const Def * body() const
Definition lam.h:123
A dependent function type.
Definition lam.h:14
const Def * dom() const
Definition lam.h:35
World & new_world()
Create new Defs into this.
Definition phase.h:146
virtual void push()
Definition rewrite.h:52
virtual const Def * map(const Def *old_def, const Def *new_def)
Definition rewrite.h:59
virtual void pop()
Definition rewrite.h:53
virtual const Def * rewrite(const Def *)
Definition rewrite.cpp:27
Sigma * set(size_t i, const Def *def)
Definition tuple.h:32
const Def * app(const Def *callee, const Def *arg)
Definition world.cpp:201
Lam * mut_con(const Def *dom)
Definition world.h:334
Sigma * mut_sigma(const Def *type, size_t size)
Definition world.h:374
const Def * rewrite_imm_App(const App *) override
Definition ds2cps.cpp:10
#define DLOG(...)
Vaporizes to nothingness in Debug build.
Definition log.h:95
The direct style Plugin
Definition direct.h:8
const Def * op_cps2ds_dep(const Def *k)
Definition direct.h:16