riscv-boom / boom-template Goto Github PK
View Code? Open in Web Editor NEWThis project forked from ucb-bar/chipyard
DEPRECATED. Please use Chipyard (https://github.com/ucb-bar/chipyard) to build BOOM
License: Other
This project forked from ucb-bar/chipyard
DEPRECATED. Please use Chipyard (https://github.com/ucb-bar/chipyard) to build BOOM
License: Other
Recently, I tried to build a medium boom for performance test. It takes 80+ minutes for firrtl to generated the verilog source code. I also built it from this boom-template from scratch without local modification, and ended up with similar results.
The I found that firrtl complie time is related to the size of Load Queue. Following table lists my results:
Load queue entries: Total FIRRTL Compile Time
make -C /home/test/boom-template/rocket-chip/firrtl SBT="java -Xmx8G -Xss8M -jar /home/test/boom-template/rocket-chip/sbt-launch.jar ++2.12.4" root_dir=/home/test/boom-template/rocket-chip/firrtl build-scala
make[1]: Entering directory '/home/test/boom-template/rocket-chip/firrtl'
java -Xmx8G -Xss8M -jar /home/test/boom-template/rocket-chip/sbt-launch.jar ++2.12.4 "assembly"
[info] Loading settings for project firrtl-build from plugins.sbt ...
[info] Loading project definition from /home/test/boom-template/rocket-chip/firrtl/project
[info] Updating ProjectRef(uri("file:/home/test/boom-template/rocket-chip/firrtl/project/"), "firrtl-build")...
[info] Done updating.
[warn] There may be incompatibilities among your library dependencies; run 'evicted' to see detailed eviction warnings.
[info] Loading settings for project firrtl from build.sbt ...
[info] Set current project to firrtl (in build file:/home/test/boom-template/rocket-chip/firrtl/)
[info] Setting Scala version to 2.12.4 on 1 projects.
[info] Reapplying settings...
[info] Set current project to firrtl (in build file:/home/test/boom-template/rocket-chip/firrtl/)
[info] Updating ...
[info] Done updating.
[info] Compiling 1 protobuf files to /home/test/boom-template/rocket-chip/firrtl/target/scala-2.12/src_managed/main
[info] Compiling schema /home/test/boom-template/rocket-chip/firrtl/src/main/proto/firrtl.proto
protoc-jar: protoc version: 3.5.1, detected platform: linux-x86_64 (linux/amd64)
protoc-jar: embedded: bin/3.5.1/protoc-3.5.1-linux-x86_64.exe
protoc-jar: executing: [/tmp/protocjar17305608848001377076/bin/protoc.exe, -I/home/test/boom-template/rocket-chip/firrtl/src/main/proto, -I/home/test/boom-template/rocket-chip/firrtl/target/protobuf_external, --java_out=/home/test/boom-template/rocket-chip/firrtl/target/scala-2.12/src_managed/main, /home/test/boom-template/rocket-chip/firrtl/src/main/proto/firrtl.proto]
[info] Compiling protobuf
[info] Protoc target directory: /home/test/boom-template/rocket-chip/firrtl/target/scala-2.12/src_managed/main
[info] Compiling 119 Scala sources and 5 Java sources to /home/test/boom-template/rocket-chip/firrtl/target/scala-2.12/classes ...
[error] source file '/home/test/boom-template/rocket-chip/firrtl/target/scala-2.12/src_managed/main/firrtl/antlr/FIRRTLBaseVisitor.java' could not be found
[error] one error found
[error] (Compile / compileIncremental) Compilation failed
[error] Total time: 6 s, completed Jun 17, 2019, 10:46:02 AM
When I execute "make" in verisim, the error occurred:
[error] (run-main-0) java.lang.ClassNotFoundException: boom.system.Generator [error] java.lang.ClassNotFoundException: boom.system.Generator [error] at java.lang.ClassLoader.findClass(ClassLoader.java:530) [error] at java.lang.ClassLoader.loadClass(ClassLoader.java:424) [error] at sbt.internal.inc.classpath.ClasspathFilter.loadClass(ClassLoaders.scala:70) [error] at java.lang.ClassLoader.loadClass(ClassLoader.java:357) [error] at java.lang.Class.forName0(Native Method) [error] at java.lang.Class.forName(Class.java:348) [error] at sbt.Run.getMainMethod(Run.scala:98) [error] at sbt.Run.run0(Run.scala:86) [error] at sbt.Run.execute$1(Run.scala:65) [error] at sbt.Run.$anonfun$run$4(Run.scala:77) [error] at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12) [error] at sbt.util.InterfaceUtil$$anon$1.get(InterfaceUtil.scala:10) [error] at sbt.TrapExit$App.run(TrapExit.scala:252) [error] at java.lang.Thread.run(Thread.java:748) [error] java.lang.RuntimeException: Nonzero exit code: 1 [error] at sbt.Run$.executeTrapExit(Run.scala:124) [error] at sbt.Run.run(Run.scala:77) [error] at sbt.Defaults$.$anonfun$bgRunMainTask$6(Defaults.scala:1147) [error] at sbt.Defaults$.$anonfun$bgRunMainTask$6$adapted(Defaults.scala:1142) [error] at sbt.internal.BackgroundThreadPool.$anonfun$run$1(DefaultBackgroundJobService.scala:366) [error] at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12) [error] at scala.util.Try$.apply(Try.scala:209) [error] at sbt.internal.BackgroundThreadPool$BackgroundRunnable.run(DefaultBackgroundJobService.scala:289) [error] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [error] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [error] at java.lang.Thread.run(Thread.java:748) [error] (Compile / runMain) Nonzero exit code: 1 [error] Total time: 1 s, completed May 30, 2019 6:12:58 AM make: *** [/root/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig.fir] Error 1
I don't know where the problem is and how to deal with it. Besides, I find that the ''boom-template/verisim/generated-src'' directory is empty.
Thanks in advance.
[CentOS 7]
Make fails in the verisim directory:
[error] (Thread-17) java.io.IOException: Cannot run program "dtc": error=2, No such file or directory
[error] java.io.IOException: Cannot run program "dtc": error=2, No such file or directory
[error] at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
[error] at scala.sys.process.ProcessBuilderImpl$Simple.run(ProcessBuilderImpl.scala:71)
[error] at scala.sys.process.ProcessImpl$PipedProcesses.runAndExitValue(ProcessImpl.scala:138)
[error] at scala.sys.process.ProcessImpl$PipedProcesses.runAndExitValue(ProcessImpl.scala:117)
[error] at scala.sys.process.ProcessImpl$CompoundProcess.$anonfun$x$4$1(ProcessImpl.scala:96)
[error] at scala.sys.process.ProcessImpl$Spawn$$anon$1.run(ProcessImpl.scala:23)
[error] Caused by: java.io.IOException: error=2, No such file or directory
[error] at java.lang.UNIXProcess.forkAndExec(Native Method)
[error] at java.lang.UNIXProcess.(UNIXProcess.java:247)
[error] at java.lang.ProcessImpl.start(ProcessImpl.java:134)
[error] at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
[error] at scala.sys.process.ProcessBuilderImpl$Simple.run(ProcessBuilderImpl.scala:71)
[error] at scala.sys.process.ProcessImpl$PipedProcesses.runAndExitValue(ProcessImpl.scala:138)
[error] at scala.sys.process.ProcessImpl$PipedProcesses.runAndExitValue(ProcessImpl.scala:117)
[error] at scala.sys.process.ProcessImpl$CompoundProcess.$anonfun$x$4$1(ProcessImpl.scala:96)
[error] at scala.sys.process.ProcessImpl$Spawn$$anon$1.run(ProcessImpl.scala:23)
^@^Cmake: *** [/data/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig.fir] Error 130
command: make run CONFIG=BoomConfig
showing following error:
make VM_PARALLEL_BUILDS=1 -C /home/ceems-lab/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig -f VTestHarness.mk
make[1]: Entering directory '/home/ceems-lab/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig'
g++ SimDTM.o SimJTAG.o emulator.o remote_bitbang.o verilated.o verilated_dpi.o VTestHarness__ALL.a -L/home/ceems-lab/rocket-chip/riscv-tools/lib -Wl,-rpath,/home/ceems-lab/rocket-chip/riscv-tools/lib -L/home/ceems-lab/boom-template/verisim -lfesvr -lpthread -o /home/ceems-lab/boom-template/verisim/simulator-boom.system-BoomConfig -lm -lstdc++
/usr/bin/ld: cannot find -lfesvr
collect2: error: ld returned 1 exit status
VTestHarness.mk:75: recipe for target '/home/ceems-lab/boom-template/verisim/simulator-boom.system-BoomConfig' failed
make[1]: *** [/home/ceems-lab/boom-template/verisim/simulator-boom.system-BoomConfig] Error 1
make[1]: Leaving directory '/home/ceems-lab/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig'
Makefile:90: recipe for target '/home/ceems-lab/boom-template/verisim/simulator-boom.system-BoomConfig' failed
make: *** [/home/ceems-lab/boom-template/verisim/simulator-boom.system-BoomConfig] Error 2
I'm following the README as follows:
git clone https://github.com/riscv-boom/boom-template.git
cd boom-template
./scripts/init-submodules.sh
export RISCV=~/.local
export PATH=$RISCV/bin:$PATH
./scripts/build-tools.sh
But the last line says:
[...]
Configuring project riscv-pk
Building project riscv-pk
gcc: error: unrecognized argument in option ‘-mcmodel=medany’
gcc: note: valid arguments to ‘-mcmodel=’ are: 32 kernel large medium small; did you mean ‘medium’?
gcc: error: unrecognized argument in option ‘-mcmodel=medany’
gcc: note: valid arguments to ‘-mcmodel=’ are: 32 kernel large medium small; did you mean ‘medium’?
gcc: error: unrecognized argument in option ‘-mcmodel=medany’
gcc: note: valid arguments to ‘-mcmodel=’ are: 32 kernel large medium small; did you mean ‘medium’?
make: *** [Makefile:319: file.o] Error 1
make: *** Waiting for unfinished jobs....
gcc: error: unrecognized argument in option ‘-mcmodel=medany’
make: *** [Makefile:319: syscall.o] Error 1
gcc: note: valid arguments to ‘-mcmodel=’ are: 32 kernel large medium small; did you mean ‘medium’?
gcc: error: unrecognized argument in option ‘-mcmodel=medany’
make: *** [Makefile:319: handlers.o] Error 1
gcc: note: valid arguments to ‘-mcmodel=’ are: 32 kernel large medium small; did you mean ‘medium’?
gcc: error: unrecognized argument in option ‘-mcmodel=medany’
gcc: note: valid arguments to ‘-mcmodel=’ are: 32 kernel large medium small; did you mean ‘medium’?
make: *** [Makefile:319: frontend.o] Error 1
make: *** [Makefile:319: elf.o] Error 1
make: *** [Makefile:319: console.o] Error 1
I found some related issues, but I'm reporting here because it'd be better for this repo's README to be updated as well.
Here is some meta information:
$ uname -a
Linux jeehoonkang-home 5.0.5-1-MANJARO #1 SMP PREEMPT Wed Mar 27 19:15:04 UTC 2019 x86_64 GNU/Linux
$ gcc --version
gcc (GCC) 8.2.1 20181127
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ git rev-parse HEAD
aeadc8a7f9eea9e20011b33e9ea66506fd54fca1
riscv-torture does not provide good coverage of compressed instructions. ucb-bar/riscv-torture#7
I really like @cliffordwolf 's torture testing using csmith for PicoRV32. This seems like a good thing to have in the scripts directory, and possibly in CI as well. I used this to find a bug in the RVC implementation. https://github.com/cliffordwolf/picorv32/tree/master/scripts/csmith
He has a good writeup of the script here. ucb-bar/riscv-torture#7 (comment)
I have an issue with building the boom-template verisim project, the make process fails and doesn't generate the binary target. I am new to this problem so perhaps I am just doing something wrong. It should be noted the VTestHarness.mk that I think its trying to use is empty in my directory generated-src/boom.system.TestHarness.BoomConfig/VTestHarness.mk
user@syl:~/src/boom-template/verisim$ make
mkdir -p /home/user/src/boom-template/verisim/generated-src
cd /home/user/src/boom-template && java -Xmx2G -Xss8M -jar /home/user/src/boom-template/rocket-chip/sbt-launch.jar ++2.12.4 "runMain boom.system.Generator /home/user/src/boom-template/verisim/generated-src boom.system TestHarness boom.system BoomConfig"
[info] Loading project definition from /home/user/src/boom-template/project
[info] Loading settings from build.sbt ...
[info] Loading settings from build.sbt ...
[info] Loading settings from plugins.sbt ...
[info] Loading project definition from /home/user/src/boom-template/rocket-chip/project
[info] Loading settings from build.sbt ...
[info] Loading settings from build.sbt ...
[info] Loading settings from build.sbt ...
Using addons:
[info] Set current project to boom-template (in build file:/home/user/src/boom-template/)
[info] Set current project to boom (in build file:/home/user/src/boom-template/)
[info] Setting Scala version to 2.12.4 on 8 projects.
[info] Reapplying settings...
Using addons:
[info] Set current project to boom (in build file:/home/user/src/boom-template/)
[info] Set current project to boom (in build file:/home/user/src/boom-template/)
[warn] Multiple main classes detected. Run 'show discoveredMainClasses' to see the list
[info] Running boom.system.Generator /home/user/src/boom-template/verisim/generated-src boom.system TestHarness boom.system BoomConfig
[info] [0.001] Elaborating design...
Building TestHarness for an ExampleBoomSystem.
Interrupt map (2 harts 2 interrupts):
[1, 2] => dut
==Dense BTB==
Sets : 512
Banks : 2
Ways : 4
Branch Levels : 2
Tag Size : 13
Offset Size : 13
==BIM==
(16 Kbits = 2 kB) Bimodal Table (1024 entries across 2 banks)
==TAGE==
4.501953125 kB TAGE Predictor (36 Kbits) (max history length: 90 bits)
TageTable[0] - 1024 entries, 27 bits of history, 9-bit tags, 3-bit counters
TageTable[1] - 1024 entries, 45 bits of history, 9-bit tags, 3-bit counters
TageTable[2] - 1024 entries, 63 bits of history, 9-bit tags, 3-bit counters
TageTable[3] - 1024 entries, 90 bits of history, 9-bit tags, 3-bit counters
==L1-ICache==
Fetch bytes : 16
Block bytes : 64
Row bytes : 16
Word bits : 128
Sets : 64
Ways : 8
Refill cycles : 4
RAMs : (64 x 256) using 2 banks
Dual-banked
I-TLB entries : 32
~*** Two-wide Machine ***~
-== Quad Issue ==-
ExeUnit--
- Mem
ExeUnit--
- ALU
- Mul
- Div
- IFPU
ExeUnit--
- ALU
()
ExeUnit--
- FPU (Latency: 4)
- FDiv/FSqrt
- FPIU (writes to Integer RF)
==ROB==
Machine Width : 2
Rob Entries : 80
Rob Rows : 40
Rob Row size : 6
log2Ceil(width): 1
FPU FFlag Ports: 2
FPU Unit Enabled
VM Enabled
FDivSqrt Enabled
Fetch Width : 8
Decode Width : 2
Issue Width : 4
ROB Size : 80
Issue Window Size : List(20, 20, 20) (Age-based Priority)
Load/Store Unit Size : 32/18
Num Int Phys Registers: 100
Num FP Phys Registers: 64
Max Branch Count : 8
BTB Size : 2048 entries (512 x 4 ways)
RAS Size : 8
Rename Stage Latency : 2
RegRead Stage Latency : 1
==Integer Regfile==
Num RF Read Ports : 6
Num RF Write Ports : 3
RF Cost (R+W)*(R+2W) : 108
Bypassable Units : List(true, true, true)
Num Slow Wakeup Ports : 2
Num Fast Wakeup Ports : 2
Num Bypass Ports : 4
==Floating Point Regfile==
Num RF Read Ports : 3
Num RF Write Ports : 2
RF Cost (R+W)*(R+2W) : 35
Bypassable Units : List(false, false)
Num Wakeup Ports : 2
Num Bypass Ports : 0
DCache Ways : 8
DCache Sets : 64
ICache Ways : 8
ICache Sets : 64
D-TLB Entries : 16
I-TLB Entries : 32
Paddr Bits : 32
Vaddr Bits : 39
<stdout>: Warning (simple_bus_reg): Node /soc/external-interrupts missing or empty reg/ranges property
/dts-v1/;
/ {
#address-cells = <1>;
#size-cells = <1>;
compatible = "freechips,rocketchip-unknown-dev";
model = "freechips,rocketchip-unknown";
L13: cpus {
#address-cells = <1>;
#size-cells = <0>;
L5: cpu@0 {
clock-frequency = <0>;
compatible = "ucb-bar,boom0", "riscv";
d-cache-block-size = <64>;
d-cache-sets = <64>;
d-cache-size = <32768>;
d-tlb-sets = <1>;
d-tlb-size = <16>;
device_type = "cpu";
i-cache-block-size = <64>;
i-cache-sets = <64>;
i-cache-size = <32768>;
i-tlb-sets = <1>;
i-tlb-size = <32>;
mmu-type = "riscv,sv39";
next-level-cache = <&L7>;
reg = <0x0>;
riscv,isa = "rv64imafdc";
status = "okay";
timebase-frequency = <1000000>;
tlb-split;
L3: interrupt-controller {
#interrupt-cells = <1>;
compatible = "riscv,cpu-intc";
interrupt-controller;
};
};
};
L7: memory@80000000 {
device_type = "memory";
reg = <0x80000000 0x10000000>;
};
L12: soc {
#address-cells = <1>;
#size-cells = <1>;
compatible = "freechips,rocketchip-unknown-soc", "simple-bus";
ranges;
L1: clint@2000000 {
compatible = "riscv,clint0";
interrupts-extended = <&L3 3 &L3 7>;
reg = <0x2000000 0x10000>;
reg-names = "control";
};
L2: debug-controller@0 {
compatible = "sifive,debug-013", "riscv,debug-013";
interrupts-extended = <&L3 65535>;
reg = <0x0 0x1000>;
reg-names = "control";
};
L10: error-device@3000 {
compatible = "sifive,error0";
reg = <0x3000 0x1000>;
reg-names = "mem";
};
L6: external-interrupts {
interrupt-parent = <&L0>;
interrupts = <1 2>;
};
L0: interrupt-controller@c000000 {
#interrupt-cells = <1>;
compatible = "riscv,plic0";
interrupt-controller;
interrupts-extended = <&L3 11 &L3 9>;
reg = <0xc000000 0x4000000>;
reg-names = "control";
riscv,max-priority = <3>;
riscv,ndev = <2>;
};
L8: mmio-port-axi4@60000000 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "simple-bus";
ranges = <0x60000000 0x60000000 0x20000000>;
};
L9: rom@10000 {
compatible = "sifive,rom0";
reg = <0x10000 0x10000>;
reg-names = "mem";
};
};
};
Generated Address Map
0 - 1000 ARWX debug-controller@0
3000 - 4000 ARWX error-device@3000
10000 - 20000 R XC rom@10000
2000000 - 2010000 ARW clint@2000000
c000000 - 10000000 ARW interrupt-controller@c000000
60000000 - 80000000 RWX mmio-port-axi4@60000000
80000000 - 90000000 RWXC memory@80000000
[info] [54.599] Done elaborating.
[success] Total time: 62 s, completed Mar 19, 2019, 4:50:46 PM
java -Xmx2G -Xss8M -cp "/home/user/src/boom-template/rocket-chip/firrtl/utils/bin/firrtl.jar":""/home/user/src/boom-template/rocket-chip/target/scala-2.12/classes:/home/user/src/boom-template/rocket-chip/chisel3/target/scala-2.12/*"" firrtl.Driver -i /home/user/src/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig.fir -o /home/user/src/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig.v -X verilog -faf /home/user/src/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig.anno.json
Default case invoked for:
opcode = 0, "Node"
Default case invoked for:
opcode = 0, "Node"
Default case invoked for:
opcode = 0, "Node"
Default case invoked for:
opcode = 0, "Node"
Default case invoked for:
opcode = 0, "Node"
Total FIRRTL Compile Time: 185435.4 ms
rm -rf /home/user/src/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig
mkdir -p /home/user/src/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig
/home/user/src/boom-template/verisim/verilator/install/bin/verilator --cc --exe --top-module TestHarness +define+PRINTF_COND=\$c\(\"verbose\",\"\&\&\"\,\"done_reset\"\) +define+STOP_COND=\$c\(\"done_reset\"\) --assert --output-split 20000 --no-threads -Wno-STMTDLY -Wno-CMPCONST --x-assign unique -I/home/user/src/boom-template/testchipip/vsrc -I/home/user/src/boom-template/rocket-chip/src/main/resources/vsrc -O3 -CFLAGS " -O1 -std=c++11 -I/opt/riscv/include -D__STDC_FORMAT_MACROS -DVERILATOR -DTEST_HARNESS=VTestHarness -include /home/user/src/boom-template/rocket-chip/src/main/resources/csrc/verilator.h -include /home/user/src/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig.plusArgs" -Mdir /home/user/src/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig \
-o /home/user/src/boom-template/verisim/simulator-boom.system-BoomConfig /home/user/src/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig.v /home/user/src/boom-template/rocket-chip/src/main/resources/csrc/SimDTM.cc /home/user/src/boom-template/rocket-chip/src/main/resources/csrc/SimJTAG.cc /home/user/src/boom-template/rocket-chip/src/main/resources/csrc/remote_bitbang.cc /home/user/src/boom-template/rocket-chip/src/main/resources/csrc/emulator.cc -LDFLAGS " -L/opt/riscv/lib -Wl,-rpath,/opt/riscv/lib -L/home/user/src/boom-template/verisim -lfesvr -lpthread" \
-CFLAGS "-I/home/user/src/boom-template/verisim/generated-src -include /home/user/src/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig/VTestHarness.h"
touch /home/user/src/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig/VTestHarness.mk
make VM_PARALLEL_BUILDS=1 -C /home/user/src/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig -f VTestHarness.mk
make[1]: Entering directory '/home/user/src/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig'
make[1]: *** No targets. Stop.
make[1]: Leaving directory '/home/user/src/boom-template/verisim/generated-src/boom.system.TestHarness.BoomConfig'
Makefile:90: recipe for target '/home/user/src/boom-template/verisim/simulator-boom.system-BoomConfig' failed
make: *** [/home/user/src/boom-template/verisim/simulator-boom.system-BoomConfig] Error 2
We may want to include block device tests that exist in project template.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.