diff --git a/.gitmodules b/.gitmodules index 31a788ee..0458f31c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -716,3 +716,6 @@ [submodule "vendor/grammars/language-povray"] path = vendor/grammars/language-povray url = https://github.com/c-lipka/language-povray +[submodule "vendor/grammars/sublime-terra"] + path = vendor/grammars/sublime-terra + url = https://github.com/pyk/sublime-terra diff --git a/grammars.yml b/grammars.yml index 706cdaa0..f7f75f77 100755 --- a/grammars.yml +++ b/grammars.yml @@ -549,6 +549,8 @@ vendor/grammars/sublime-spintools/: - source.spin vendor/grammars/sublime-tea: - source.tea +vendor/grammars/sublime-terra: +- source.terra vendor/grammars/sublime-text-ox/: - source.ox vendor/grammars/sublime-text-pig-latin/: diff --git a/lib/linguist/languages.yml b/lib/linguist/languages.yml index 7b4383df..624427cb 100755 --- a/lib/linguist/languages.yml +++ b/lib/linguist/languages.yml @@ -3565,6 +3565,16 @@ Tea: tm_scope: source.tea ace_mode: text +Terra: + type: programming + extensions: + - .t + color: "#00004c" + ace_mode: lua + group: Lua + interpreters: + - lua + Text: type: prose wrap: true diff --git a/samples/Terra/arith.t b/samples/Terra/arith.t new file mode 100644 index 00000000..d73a46da --- /dev/null +++ b/samples/Terra/arith.t @@ -0,0 +1,114 @@ +--[[ + +- ++ + +* +/ +% + +^ +and +or +~= == < > >= <= +<< >> + +]] + + + + +terra test0() + var a = 1 + 3 + var b = 1LL + 2LL + var c = 1ULL + 2ULL + var d = 1.f + 2.f + var e = 1.0 + 2.0 + return a + b + c + d + e +end +terra test1() + var a = 1 - 3 + var b = 1LL - 2LL + var c = 1ULL - 2ULL + var d = 1.f - 2.f + var e = 1.0 - 2.0 + return a - b - c - d - e +end +terra test2() + var a = 2 * 3 + var b = 3LL * 2LL + var c = 3ULL * 2ULL + var d = 1.f * 2.f + var e = 3.0 * 2.0 + return a * b * c * d * e +end + +terra test3() + var a = 2 / 3 + 1 + var b = 3LL / 2LL + 1 + var c = 3ULL / 2ULL + var d = 1.f / 2.f + var e = 3.0 / 2.0 + return a * b * c * d * e +end + +terra test4() + var a = 2 % 3 + var b = 3LL % 4LL + var c = 3ULL % 2ULL + var d = 1.f % 2.f + var e = 3.75 % 2.0 + return (a == 2) and (b == 3LL) and (d == 1.f) and (e == 1.75) +end + +terra test5() + var a = 2 ^ 3 + var b = 3LL ^ 4LL + var c = 3ULL ^ 2ULL + return (a == 1) and (b == 7LL) and (c == 1ULL) +end + +terra test6() + var a = 2 and 3 + var b = 3LL and 4LL + var c = 3ULL and 2ULL + return (a == 2) and (b == 0LL) and (c == 2ULL) +end + +terra test7() + var a = 2 or 3 + var b = 3LL or 4LL + var c = 3ULL or 2ULL + return (a == 3) and (b == 7LL) and (c == 3ULL) +end + + +terra test8() + var a0,a1 = 2 ~= 3, 2 == 3 + var b0,b1 = 2 < 3, 2 >= 3 + var c0,c1 = 2 > 3, 2 <= 3 + + return a0 and not a1 and b0 and not b1 and not c0 and c1 +end + +terra test9() + var a0, a1 = 8 >> 1, 8 << 1 + var b0, b1 = -8 >> 1, -8 << 1 + return a0 == 4 and a1 == 16 and b0 == -4 and b1 == -16 +end + + +local test = require("test") + +test.eq(test0(),16) +test.eq(test1(),2) +test.eq(test2(),2592) +test.eq(test3(),1.5) + +test.eq(test4(),true) + +test.eq(test5(),true) +test.eq(test6(),true) +test.eq(test7(),true) +test.eq(test8(),true) +test.eq(test9(),true) \ No newline at end of file diff --git a/samples/Terra/arrayt.t b/samples/Terra/arrayt.t new file mode 100644 index 00000000..29fca5b4 --- /dev/null +++ b/samples/Terra/arrayt.t @@ -0,0 +1,75 @@ +C = terralib.includecstring [[ + #include + #include +]] +local arraytypes = {} +function Array(T) + local struct ArrayImpl { + data : &T; + N : int; + } + function ArrayImpl.metamethods.__typename(self) + return "Array("..tostring(T)..")" + end + arraytypes[ArrayImpl] = true + terra ArrayImpl:init(N : int) + self.data = [&T](C.malloc(N*sizeof(T))) + self.N = N + end + terra ArrayImpl:free() + C.free(self.data) + end + ArrayImpl.metamethods.__apply = macro(function(self,idx) + return `self.data[idx] + end) + ArrayImpl.metamethods.__methodmissing = macro(function(methodname,selfexp,...) + local args = terralib.newlist {...} + local i = symbol(int) + local promotedargs = args:map(function(a) + if arraytypes[a:gettype()] then + return `a(i) + else + return a + end + end) + return quote + var self = selfexp + var r : ArrayImpl + r:init(self.N) + for [i] = 0,r.N do + r.data[i] = self.data[i]:[methodname](promotedargs) + end + in + r + end + end) + return ArrayImpl +end + +struct Complex { + real : float; + imag : float; +} + +terra Complex:add(c : Complex) + return Complex { self.real + c.real, self.imag + c.imag } +end + +ComplexArray = Array(Complex) +N = 10 +terra testit() + var ca : ComplexArray + ca:init(N) + for i = 0,N do + ca(i) = Complex { i, i + 1 } + end + var ra = ca:add(ca) + return ra +end +local r = testit() +assert(r.N == N) +for i = 0,N-1 do + assert(r.data[i].real == 2*i) + assert(r.data[i].imag == 2*(i+1)) +end +assert(tostring(Array(int)) == "Array(int32)") \ No newline at end of file diff --git a/samples/Terra/benchmark_nbody.t b/samples/Terra/benchmark_nbody.t new file mode 100644 index 00000000..8b007193 --- /dev/null +++ b/samples/Terra/benchmark_nbody.t @@ -0,0 +1,150 @@ +local C = terralib.includecstring[[ + +#include +#include +#include + +]] + +pi = 3.141592653589793 +solar_mass = (4 * pi * pi) +days_per_year = 365.24 + +struct planet { + x : double; + y : double; + z : double; + vx : double; + vy : double; + vz : double; + mass : double; +} + +terra advance(nbodies : int, bodies : &planet, dt : double) + + for i = 0, nbodies do + var b = &bodies[i] + for j = i + 1, nbodies do + var b2 = &bodies[j] + + var dx = b.x - b2.x; + var dy = b.y - b2.y; + var dz = b.z - b2.z; + var distance = C.sqrt(dx * dx + dy * dy + dz * dz); + var mag = dt / (distance * distance * distance); + --C.printf("%f %f %f %f %f\n",dx,dy,dz,distance,mag); + b.vx = b.vx - dx * b2.mass * mag; + b.vy = b.vy - dy * b2.mass * mag; + b.vz = b.vz - dz * b2.mass * mag; + b2.vx = b2.vx + dx * b.mass * mag; + b2.vy = b2.vy + dy * b.mass * mag; + b2.vz = b2.vz + dz * b.mass * mag; + --C.printf("%f %f %f %f %f %f\n",b.vx,b.vy,b.vz,b2.vx,b2.vy,b2.vz) + end + end + for i = 0,nbodies do + var b = &bodies[i] + b.x = b.x + dt * b.vx; + b.y = b.y + dt * b.vy; + b.z = b.z + dt * b.vz; + end +end + +terra energy(nbodies : int, bodies : &planet) + var e = 0.0 + for i = 0, nbodies do + var b = &bodies[i] + e = e + 0.5 * b.mass * (b.vx * b.vx + b.vy * b.vy + b.vz * b.vz); + for j = i + 1, nbodies do + var b2 = &bodies[j] + var dx = b.x - b2.x + var dy = b.y - b2.y + var dz = b.z - b2.z + var distance = C.sqrt(dx * dx + dy * dy + dz * dz) + e = e - (b.mass * b2.mass) / distance + end + end + return e +end + +terra offset_momentum(nbodies : int, bodies : &planet) + var px,py,pz = 0.0,0.0,0.0 + + for i = 0,nbodies do + px = px + bodies[i].vx * bodies[i].mass + py = py + bodies[i].vy * bodies[i].mass + pz = pz + bodies[i].vz * bodies[i].mass + end + bodies[0].vx = - px / solar_mass + bodies[0].vy = - py / solar_mass + bodies[0].vz = - pz / solar_mass +end + +NBODIES = 5 + +terra main(argc : int, argv : &&int8) + var bodies = array( + planet { -- sun */ + 0, 0, 0, 0, 0, 0, solar_mass + }, + planet { -- jupiter */ + 4.84143144246472090e+00, + -1.16032004402742839e+00, + -1.03622044471123109e-01, + 1.66007664274403694e-03 * days_per_year, + 7.69901118419740425e-03 * days_per_year, + -6.90460016972063023e-05 * days_per_year, + 9.54791938424326609e-04 * solar_mass + }, + planet { -- saturn */ + 8.34336671824457987e+00, + 4.12479856412430479e+00, + -4.03523417114321381e-01, + -2.76742510726862411e-03 * days_per_year, + 4.99852801234917238e-03 * days_per_year, + 2.30417297573763929e-05 * days_per_year, + 2.85885980666130812e-04 * solar_mass + }, + planet { -- uranus */ + 1.28943695621391310e+01, + -1.51111514016986312e+01, + -2.23307578892655734e-01, + 2.96460137564761618e-03 * days_per_year, + 2.37847173959480950e-03 * days_per_year, + -2.96589568540237556e-05 * days_per_year, + 4.36624404335156298e-05 * solar_mass + }, + planet { -- neptune */ + 1.53796971148509165e+01, + -2.59193146099879641e+01, + 1.79258772950371181e-01, + 2.68067772490389322e-03 * days_per_year, + 1.62824170038242295e-03 * days_per_year, + -9.51592254519715870e-05 * days_per_year, + 5.15138902046611451e-05 * solar_mass + } + ) + var n = C.atoi(argv[1]) + offset_momentum(NBODIES, bodies) + C.printf ("%.9f\n", energy(NBODIES, bodies)) + for i = 0,n do + advance(NBODIES, bodies, 0.01) + end + C.printf ("%.9f\n", energy(NBODIES, bodies)); + return 0 +end + +terra run() + main(2,array("what","1000000")) +end + +--run:compile() + + +--local test = require("test") + +--print(test.time(run)) + +terralib.saveobj("benchmark_nbody",{ main = main } ) +energy:disas() +energy:printpretty() \ No newline at end of file diff --git a/vendor/grammars/sublime-terra b/vendor/grammars/sublime-terra new file mode 160000 index 00000000..d77b0341 --- /dev/null +++ b/vendor/grammars/sublime-terra @@ -0,0 +1 @@ +Subproject commit d77b0341d26f0989b2dc918ce9fb5cb8a5c7202b