From 0979e9aaf5ea8bae386e499f69d08f9ba73637ec Mon Sep 17 00:00:00 2001 From: Tianqi Chen Date: Fri, 16 Mar 2018 23:06:01 -0700 Subject: [PATCH] [DOCS] Initial docs (#4) * [DOCS] Initial docs * update instruction --- vta/CONTRIBUTORS.md | 38 +++ vta/Makefile | 89 +++++++ vta/NEWS.md | 12 + vta/docs/.gitignore | 3 + vta/docs/Doxyfile | 6 +- vta/docs/Makefile | 193 ++++++++++++++ vta/docs/README.txt | 5 + vta/docs/_static/css/tvm_theme.css | 11 + vta/docs/api_links.rst | 6 + vta/docs/conf.py | 212 +++++++++++++++ vta/docs/dev/index.rst | 11 + vta/docs/dev/runtime.md | 3 + vta/docs/how_to/contribute.md | 102 ++++++++ vta/docs/how_to/install.md | 19 ++ vta/docs/index.rst | 20 ++ vta/make/config.mk | 27 ++ vta/python/vta/__init__.py | 5 + vta/tests/lint/pylintrc | 406 +++++++++++++++++++++++++++++ vta/tutorials/README.txt | 3 + vta/tutorials/get_started.py | 39 +++ 20 files changed, 1207 insertions(+), 3 deletions(-) create mode 100644 vta/CONTRIBUTORS.md create mode 100644 vta/Makefile create mode 100644 vta/NEWS.md create mode 100644 vta/docs/Makefile create mode 100644 vta/docs/README.txt create mode 100644 vta/docs/_static/css/tvm_theme.css create mode 100644 vta/docs/api_links.rst create mode 100644 vta/docs/conf.py create mode 100644 vta/docs/dev/index.rst create mode 100644 vta/docs/dev/runtime.md create mode 100644 vta/docs/how_to/contribute.md create mode 100644 vta/docs/how_to/install.md create mode 100644 vta/docs/index.rst create mode 100644 vta/make/config.mk create mode 100644 vta/python/vta/__init__.py create mode 100644 vta/tests/lint/pylintrc create mode 100644 vta/tutorials/README.txt create mode 100644 vta/tutorials/get_started.py diff --git a/vta/CONTRIBUTORS.md b/vta/CONTRIBUTORS.md new file mode 100644 index 00000000..0df700b2 --- /dev/null +++ b/vta/CONTRIBUTORS.md @@ -0,0 +1,38 @@ +Contributing to VTA +=================== +VTA is part of TVM software/hardware stack. +We adopts Apache style committer model. +The package is developed and used by the community. + +We actively seek committers that come from community contributors who: +- Made substantial contributions to the project. + - All forms of contributions are valued (see detail in next section). +- Willing to spend time on maintaining and lead the project. + +Contributions +------------- +We value all forms of contributions, here is a non-comprehensive +list of contributions that are welcomed + +- Documentation and usage examples +- Hardware implementations of the design. +- Community participation, answering questions and issues. +- Code readability and developer guide + - We welcome contributions that add code comments + to improve readability + - We also welcome contributions to docs to explain the + design choices of the internal. +- Test cases to make the codebase more robust +- Tutorials, blog posts, talks that promote the project. + + +How to Contribute +----------------- +See [Contributor guide](docs/how_to/contribute.md) on how to contribute. + +Committers +---------- +Committers are people who have made substantial contribution to the project and granted write access to the project. + +- [Thierry Moreau](http://homes.cs.washington.edu/~moreau/), University of Washington +- [Tianqi Chen](https://github.com/tqchen), University of Washington diff --git a/vta/Makefile b/vta/Makefile new file mode 100644 index 00000000..20414cde --- /dev/null +++ b/vta/Makefile @@ -0,0 +1,89 @@ +ROOTDIR = $(CURDIR) + +ifndef config +ifneq ("$(wildcard ./config.mk)", "") + config = config.mk +else + config = make/config.mk +endif +endif +include $(config) + +export LDFLAGS = -pthread -lm +export CFLAGS = -std=c++11 -Wall -O2 -Iinclude -fPIC + +ifdef NNVM_PATH + CFLAGS += -I$(NNVM_PATH)/include +else + NNVM_PATH = $(ROOTDIR)/nnvm + CFLAGS += -I$(NNVM_PATH)/include +endif + +ifdef TVM_PATH + CFLAGS += -I$(TVM_PATH)/include -I$(TVM_PATH)/dlpack/include -I$(TVM_PATH)/HalideIR/src +else + TVM_PATH = $(NNVM_PATH)/tvm + CFLAGS += -I$(TVM_PATH)/include -I$(TVM_PATH)/dlpack/include -I$(TVM_PATH)/HalideIR/src +endif + +ifdef DMLC_CORE_PATH + CFLAGS += -I$(DMLC_CORE_PATH)/include +else + CFLAGS += -I$(NNVM_PATH)/dmlc-core/include +endif + +ifneq ($(ADD_CFLAGS), NONE) + CFLAGS += $(ADD_CFLAGS) +endif + +ifneq ($(ADD_LDFLAGS), NONE) + LDFLAGS += $(ADD_LDFLAGS) +endif + +ifeq ($(UNAME_S), Darwin) + SHARED_LIBRARY_SUFFIX := dylib + WHOLE_ARCH= -all_load + NO_WHOLE_ARCH= -noall_load + LDFLAGS += -undefined dynamic_lookup +else + SHARED_LIBRARY_SUFFIX := so + WHOLE_ARCH= --whole-archive + NO_WHOLE_ARCH= --no-whole-archive +endif + + +all: lib/libvta.$(SHARED_LIBRARY_SUFFIX) + +SRC = $(wildcard src/*.cc src/*.cc) +ALL_OBJ = $(patsubst %.cc, build/%.o, $(SRC)) +ALL_DEP = $(ALL_OBJ) + +test: $(TEST) + +build/src/%.o: src/%.cc + @mkdir -p $(@D) + $(CXX) $(CFLAGS) -MM -MT build/src/$*.o $< >build/src/$*.d + $(CXX) -c $(CFLAGS) -c $< -o $@ + +lib/libvta.$(SHARED_LIBRARY_SUFFIX): $(ALL_DEP) + @mkdir -p $(@D) + $(CXX) $(CFLAGS) -shared -o $@ $(filter %.o, $^) $(LDFLAGS) + +lint: pylint cpplint + +cpplint: + python nnvm/dmlc-core/scripts/lint.py vta cpp include src + +pylint: + pylint python/vta --rcfile=$(ROOTDIR)/tests/lint/pylintrc + +doc: + doxygen docs/Doxyfile + +clean: + $(RM) -rf build lib bin *~ */*~ */*/*~ */*/*/*~ */*.o */*/*.o */*/*/*.o + + +-include build/*.d +-include build/*/*.d +-include build/*/*/*.d diff --git a/vta/NEWS.md b/vta/NEWS.md new file mode 100644 index 00000000..2c8fe555 --- /dev/null +++ b/vta/NEWS.md @@ -0,0 +1,12 @@ +TVM Change Log +============== + +This file records the changes in VTA stack in reverse chronological order. + + +## Initial version + +- Vivado based hardware +- Driver for PYNQ +- Runtime library. +- TVM compiler stack. diff --git a/vta/docs/.gitignore b/vta/docs/.gitignore index 8e786536..845005a7 100644 --- a/vta/docs/.gitignore +++ b/vta/docs/.gitignore @@ -1 +1,4 @@ doxygen +modules +tutorials +_build diff --git a/vta/docs/Doxyfile b/vta/docs/Doxyfile index 6a9e3d52..77981f68 100644 --- a/vta/docs/Doxyfile +++ b/vta/docs/Doxyfile @@ -58,7 +58,7 @@ PROJECT_LOGO = # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. -OUTPUT_DIRECTORY = doxygen +OUTPUT_DIRECTORY = docs/doxygen # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- # directories (in 2 levels) under the output directory of each output format and @@ -771,7 +771,7 @@ WARN_LOGFILE = # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. -INPUT = ../include +INPUT = include # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses @@ -796,7 +796,7 @@ INPUT_ENCODING = UTF-8 # *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl, # *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js. -FILE_PATTERNS = *.h +FILE_PATTERNS = *.h # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. diff --git a/vta/docs/Makefile b/vta/docs/Makefile new file mode 100644 index 00000000..1e45fb5e --- /dev/null +++ b/vta/docs/Makefile @@ -0,0 +1,193 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + +clean: + rm -rf $(BUILDDIR)/* + rm -rf gen_modules + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/rabit.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/rabit.qhc" + +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/rabit" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/rabit" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/vta/docs/README.txt b/vta/docs/README.txt new file mode 100644 index 00000000..8d93fa10 --- /dev/null +++ b/vta/docs/README.txt @@ -0,0 +1,5 @@ +The documentation of vta is generated with recommonmark and sphinx. + +- pip install sphinx>=1.5.5 sphinx-gallery sphinx_rtd_theme matplotlib Image recommonmark +- Type "make html" to generate the doc +- If we only want to build doxygen docs: at project root, type "make doc" diff --git a/vta/docs/_static/css/tvm_theme.css b/vta/docs/_static/css/tvm_theme.css new file mode 100644 index 00000000..5e0838ab --- /dev/null +++ b/vta/docs/_static/css/tvm_theme.css @@ -0,0 +1,11 @@ +.rst-content .hidden-section { + display: none; +} + +.rst-toc .hidden-section { + display: none; +} + +nav .hidden-section { + display: inherit; +} diff --git a/vta/docs/api_links.rst b/vta/docs/api_links.rst new file mode 100644 index 00000000..60dba9de --- /dev/null +++ b/vta/docs/api_links.rst @@ -0,0 +1,6 @@ +Links to API References +======================= + +This page contains links to API references that are build with different doc build system. + +* `C++ doyxgen API `_ diff --git a/vta/docs/conf.py b/vta/docs/conf.py new file mode 100644 index 00000000..8464fada --- /dev/null +++ b/vta/docs/conf.py @@ -0,0 +1,212 @@ +# -*- coding: utf-8 -*- +# +# documentation build configuration file, created by +# sphinx-quickstart on Thu Jul 23 19:40:08 2015. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. +import sys +import os, subprocess +import shlex +import recommonmark +import sphinx_gallery +from recommonmark.parser import CommonMarkParser +from recommonmark.transform import AutoStructify + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +curr_path = os.path.dirname(os.path.abspath(os.path.expanduser(__file__))) +sys.path.insert(0, os.path.join(curr_path, '../python/')) + +# -- General configuration ------------------------------------------------ + +# General information about the project. +project = u'vta' +author = u'%s developers' % project +copyright = u'2018, %s' % author +github_doc_root = 'https://github.com/uwsaml/vta/tree/master/docs/' + +# add markdown parser +CommonMarkParser.github_doc_root = github_doc_root +source_parsers = { + '.md': CommonMarkParser +} +os.environ['VTA_BUILD_DOC'] = '1' +# Version information. +import vta +version = vta.__version__ +release = vta.__version__ + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', + 'sphinx.ext.intersphinx', + 'sphinx.ext.napoleon', + 'sphinx.ext.mathjax', + 'sphinx_gallery.gen_gallery', +] + + +breathe_projects = {'vta' : 'doxygen/xml/'} +breathe_default_project = 'vta' + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# source_suffix = ['.rst', '.md'] +source_suffix = ['.rst', '.md'] + +# The encoding of source files. +#source_encoding = 'utf-8-sig' + +# generate autosummary even if no references +autosummary_generate = True + +# The master toctree document. +master_doc = 'index' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +#modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +#keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + +# -- Options for HTML output ---------------------------------------------- + +# The theme is set by the make target +html_theme = os.environ.get('VTA_THEME', 'rtd') + +on_rtd = os.environ.get('READTHEDOCS', None) == 'True' +# only import rtd theme and set it if want to build docs locally +if not on_rtd and html_theme == 'rtd': + import sphinx_rtd_theme + html_theme = 'sphinx_rtd_theme' + html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Output file base name for HTML help builder. +htmlhelp_basename = project + 'doc' + +# -- Options for LaTeX output --------------------------------------------- +latex_elements = { +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, '%s.tex' % project, project, + author, 'manual'), +] + +# hook for doxygen +def run_doxygen(folder): + """Run the doxygen make command in the designated folder.""" + try: + retcode = subprocess.call("cd %s; make doc" % folder, shell=True) + retcode = subprocess.call("rm -rf _build/html/doxygen", shell=True) + retcode = subprocess.call("mkdir -p _build/html", shell=True) + retcode = subprocess.call("cp -rf doxygen/html _build/html/doxygen", shell=True) + if retcode < 0: + sys.stderr.write("doxygen terminated by signal %s" % (-retcode)) + except OSError as e: + sys.stderr.write("doxygen execution failed: %s" % e) + +intersphinx_mapping = { + 'python': ('https://docs.python.org/{.major}'.format(sys.version_info), None), + 'numpy': ('http://docs.scipy.org/doc/numpy/', None), + 'scipy': ('http://docs.scipy.org/doc/scipy/reference', None), + 'matplotlib': ('http://matplotlib.org/', None), + 'tvm': ('http://docs.tvmlang.org/', None), +} + +from sphinx_gallery.sorting import ExplicitOrder + +examples_dirs = ['../tutorials/'] +gallery_dirs = ['tutorials'] +subsection_order = ExplicitOrder([]) + +def generate_doxygen_xml(app): + """Run the doxygen make commands if we're on the ReadTheDocs server""" + run_doxygen('..') + +def setup(app): + # Add hook for building doxygen xml when needed + # no c++ API for now + app.connect("builder-inited", generate_doxygen_xml) + app.add_stylesheet('css/tvm_theme.css') + app.add_config_value('recommonmark_config', { + 'url_resolver': lambda url: github_doc_root + url, + 'auto_doc_ref': True + }, True) + app.add_transform(AutoStructify) + + +sphinx_gallery_conf = { + 'backreferences_dir': 'gen_modules/backreferences', + 'doc_module': ('vta', 'numpy'), +'reference_url': { + 'vta': None, + 'tvm': 'http://docs.tvmlang.org', + 'matplotlib': 'http://matplotlib.org', + 'numpy': 'http://docs.scipy.org/doc/numpy-1.9.1'}, + 'examples_dirs': examples_dirs, + 'gallery_dirs': gallery_dirs, + 'subsection_order': subsection_order, + 'find_mayavi_figures': False, + 'filename_pattern': '.py', + 'expected_failing_examples': [] +} diff --git a/vta/docs/dev/index.rst b/vta/docs/dev/index.rst new file mode 100644 index 00000000..c78eda84 --- /dev/null +++ b/vta/docs/dev/index.rst @@ -0,0 +1,11 @@ +VTA Design and Developer Guide +============================== + +Building an hardware stack for deep learning involves many +many systems-level design decisions. +In this part of documentation, we share the rationale for the specific choices made when designing VTA. + +.. toctree:: + :maxdepth: 2 + + runtime diff --git a/vta/docs/dev/runtime.md b/vta/docs/dev/runtime.md new file mode 100644 index 00000000..7acab59a --- /dev/null +++ b/vta/docs/dev/runtime.md @@ -0,0 +1,3 @@ +# VTA Runtime System + +TODO Document the hardware runtime system. \ No newline at end of file diff --git a/vta/docs/how_to/contribute.md b/vta/docs/how_to/contribute.md new file mode 100644 index 00000000..b0e0de93 --- /dev/null +++ b/vta/docs/how_to/contribute.md @@ -0,0 +1,102 @@ +# Contribute to VTA + +VTA has been developed by community members. +Everyone is more than welcome to contribute. +It is a way to make the project better and more accessible to more users. +VTA is part of TVM software/hardware stack, +you can improve the compiler performance by contributing to [TVM](https://github.com/dmlc/tvm) + + +- Please add your name to [CONTRIBUTORS.md](https://github.com/dmlc/vta/blob/master/CONTRIBUTORS.md) +- Please update [NEWS.md](https://github.com/dmlc/vta/blob/master/NEWS.md) to add note on your changes to the API or added a new document. + +## Guidelines +* [Submit Pull Request](#submit-pull-request) +* [Git Workflow Howtos](#git-workflow-howtos) + - [How to resolve conflict with master](#how-to-resolve-conflict-with-master) + - [How to combine multiple commits into one](#how-to-combine-multiple-commits-into-one) + - [What is the consequence of force push](#what-is-the-consequence-of-force-push) +* [Document](#document) +* [Testcases](#testcases) +* [Core Library](#core-library) +* [Python Package](#python-package) + +## Submit Pull Request +* Before submit, please rebase your code on the most recent version of master, you can do it by +```bash +git remote add upstream [url to vta repo] +git fetch upstream +git rebase upstream/master +``` +* If you have multiple small commits, + it might be good to merge them together(use git rebase then squash) into more meaningful groups. +* Send the pull request! + - Fix the problems reported by automatic checks + - If you are contributing a new module or new function, add a test. + +## Git Workflow Howtos +### How to resolve conflict with master +- First rebase to most recent master +```bash +# The first two steps can be skipped after you do it once. +git remote add upstream [url to vta repo] +git fetch upstream +git rebase upstream/master +``` +- The git may show some conflicts it cannot merge, say ```conflicted.py```. + - Manually modify the file to resolve the conflict. + - After you resolved the conflict, mark it as resolved by +```bash +git add conflicted.py +``` +- Then you can continue rebase by +```bash +git rebase --continue +``` +- Finally push to your fork, you may need to force push here. +```bash +git push --force +``` + +### How to combine multiple commits into one +Sometimes we want to combine multiple commits, especially when later commits are only fixes to previous ones, +to create a PR with set of meaningful commits. You can do it by following steps. +- Before doing so, configure the default editor of git if you haven't done so before. +```bash +git config core.editor the-editor-you-like +``` +- Assume we want to merge last 3 commits, type the following commands +```bash +git rebase -i HEAD~3 +``` +- It will pop up an text editor. Set the first commit as ```pick```, and change later ones to ```squash```. +- After you saved the file, it will pop up another text editor to ask you modify the combined commit message. +- Push the changes to your fork, you need to force push. +```bash +git push --force +``` + +### Reset to the most recent master +You can always use git reset to reset your version to the most recent master. +Note that all your ***local changes will get lost***. +So only do it when you do not have local changes or when your pull request just get merged. +```bash +git reset --hard [hash tag of master] +git push --force +``` + +### What is the consequence of force push +The previous two tips requires force push, this is because we altered the path of the commits. +It is fine to force push to your own fork, as long as the commits changed are only yours. + +## Testcases +- All the testcases are in tests + +## Core Library +- Follow Google C style for C++. +- We use doxygen to document all the interface code. +- You can reproduce the linter checks by typing ```make lint``` + +## Python Package +- Always add docstring to the new functions in numpydoc format. +- You can reproduce the linter checks by typing ```make lint``` diff --git a/vta/docs/how_to/install.md b/vta/docs/how_to/install.md new file mode 100644 index 00000000..c6bab2f1 --- /dev/null +++ b/vta/docs/how_to/install.md @@ -0,0 +1,19 @@ +Installation Guide +================== +This page gives instructions on how to build and use VTA + +To get started, clone tvm repo from github. It is important to clone the submodules along, with ```--recursive``` option. +```bash +git clone --recursive https://github.com/uwsaml/vta +``` +For windows users who use github tools, you can open the git shell, and type the following command. +```bash +git submodule init +git submodule update --init --recursive +``` + +## Build Hardware + +## Build Runtime + +## Use VTA Python Compiler Package diff --git a/vta/docs/index.rst b/vta/docs/index.rst new file mode 100644 index 00000000..b30eac08 --- /dev/null +++ b/vta/docs/index.rst @@ -0,0 +1,20 @@ +VTA Documentation +================= + +Welcome to VTA documentation. + + +Contents +-------- + +.. toctree:: + :maxdepth: 1 + + self + how_to/install + tutorials/index + how_to/contribute + api/python/index + dev/index + api_links + genindex diff --git a/vta/make/config.mk b/vta/make/config.mk new file mode 100644 index 00000000..76d817fb --- /dev/null +++ b/vta/make/config.mk @@ -0,0 +1,27 @@ +#------------------------------------------------------------------------------- +# Template configuration for compiling VTA runtime. +# +# If you want to change the configuration, please use the following +# steps. Assume you are on the root directory of nnvm. First copy the this +# file so that any local changes will be ignored by git +# +# $ cp make/config.mk . +# +# Next modify the according entries, and then compile by +# +# $ make +# +# or build in parallel with 8 threads +# +# $ make -j8 +#------------------------------------------------------------------------------- + +#--------------------- +# choice of compiler +#-------------------- + +# the additional link flags you want to add +ADD_LDFLAGS= + +# the additional compile flags you want to add +ADD_CFLAGS= diff --git a/vta/python/vta/__init__.py b/vta/python/vta/__init__.py new file mode 100644 index 00000000..59a494fc --- /dev/null +++ b/vta/python/vta/__init__.py @@ -0,0 +1,5 @@ +"""VTA Python package backed by TVM""" + + +# version of this package +__version__ = "0.1.0" diff --git a/vta/tests/lint/pylintrc b/vta/tests/lint/pylintrc new file mode 100644 index 00000000..d9918902 --- /dev/null +++ b/vta/tests/lint/pylintrc @@ -0,0 +1,406 @@ +[MASTER] + +# Specify a configuration file. +#rcfile= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=CVS, _cy2, _cy3 + +# Add files or directories matching the regex patterns to the blacklist. The +# regex matches against base names, not paths. +ignore-patterns= + +# Pickle collected data for later comparisons. +persistent=yes + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + +# Use multiple processes to speed up Pylint. +jobs=8 + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code +extension-pkg-whitelist=numpy,opencv + +# Allow optimization of some AST trees. This will activate a peephole AST +# optimizer, which will apply various small optimizations. For instance, it can +# be used to obtain the result of joining multiple strings with the addition +# operator. Joining a lot of strings can lead to a maximum recursion error in +# Pylint and this flag can prevent that. It has one side effect, the resulting +# AST will be different than the one from reality. This option is deprecated +# and it will be removed in Pylint 2.0. +optimize-ast=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED +confidence= + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +enable=indexing-exception,old-raise-syntax + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once).You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use"--disable=all --enable=classes +# --disable=W" +disable=design,similarities,no-self-use,attribute-defined-outside-init,locally-disabled,star-args,pointless-except,bad-option-value,global-statement,fixme,suppressed-message,useless-suppression,locally-enabled,no-member,no-name-in-module,import-error,unsubscriptable-object,unbalanced-tuple-unpacking,undefined-variable,protected-access + +[REPORTS] + +# Set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html. You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". This option is deprecated +# and it will be removed in Pylint 2.0. +files-output=no + +# Tells whether to display a full report or only the messages +reports=no + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details +#msg-template= + + +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=100 + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + +# List of optional constructs for which whitespace checking is disabled. `dict- +# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. +# `trailing-comma` allows a space between comma and closing bracket: (a, ). +# `empty-line` allows space-only lines. +no-space-check=trailing-comma,dict-separator + +# Maximum number of lines in a module +max-module-lines=1000 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + + +[SPELLING] + +# Spelling dictionary name. Available dictionaries: none. To make it working +# install python-enchant package. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to indicated private dictionary in +# --spelling-private-dict-file option instead of raising a message. +spelling-store-unknown-words=no + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME,XXX + + +[TYPECHECK] + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis. It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes=optparse.Values,thread._local,_thread._local + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager + + +[LOGGING] + +# Logging modules to check that the string format arguments are in logging +# function parameter format +logging-modules=logging + + +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=4 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + + +[VARIABLES] + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching the name of dummy variables (i.e. expectedly +# not used). +dummy-variables-rgx=(_+[a-zA-Z0-9]*?$)|dummy + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_,_cb + +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six.moves,future.builtins + + +[BASIC] + +# Good variable names which should always be accepted, separated by a comma +good-names=i,j,_,a,b,op,x,y,wd,lr,kv,k,v,s,p,h,c,m,n,X,t,g,f + +# Bad variable names which should always be refused, separated by a comma +bad-names= + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Include a hint for the correct naming format with invalid-name +include-naming-hint=no + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +property-classes=abc.abstractproperty + +# Regular expression matching correct module names +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Naming hint for module names +module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression matching correct constant names +const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Naming hint for constant names +const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Regular expression matching correct inline iteration names +inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Naming hint for inline iteration names +inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ + +# Regular expression matching correct method names +method-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for method names +method-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct class attribute names +class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ + +# Naming hint for class attribute names +class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ + +# Regular expression matching correct argument names +argument-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for argument names +argument-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct attribute names +attr-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for attribute names +attr-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct variable names +variable-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for variable names +variable-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct function names +function-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for function names +function-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct class names +class-rgx=[A-Z_][a-zA-Z0-9]+$ + +# Naming hint for class names +class-name-hint=[A-Z_][a-zA-Z0-9]+$ + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=^_ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=10 + + +[ELIF] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict,_fields,_replace,_source,_make + + +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=optparse + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + + +[DESIGN] + +# Maximum number of arguments for function / method +max-args=5 + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.* + +# Maximum number of locals for function / method body +max-locals=15 + +# Maximum number of return / yield for function / method body +max-returns=6 + +# Maximum number of branch for function / method body +max-branches=12 + +# Maximum number of statements in function / method body +max-statements=50 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=0 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + +# Maximum number of boolean expressions in a if statement +max-bool-expr=5 + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +overgeneral-exceptions=Exception diff --git a/vta/tutorials/README.txt b/vta/tutorials/README.txt new file mode 100644 index 00000000..9e80d358 --- /dev/null +++ b/vta/tutorials/README.txt @@ -0,0 +1,3 @@ +Tutorials +========= +This page contains the python tutorials about how to use TVM to program VTA. diff --git a/vta/tutorials/get_started.py b/vta/tutorials/get_started.py new file mode 100644 index 00000000..d9fcb644 --- /dev/null +++ b/vta/tutorials/get_started.py @@ -0,0 +1,39 @@ +""" +Get Started with VTA +==================== +**Author**: `Tianqi Chen `_ + +This is an introduction tutorial to on how to use TVM to program VTA + +In this tutorial, we will demonstrate the basic workflow of VTA +and how we can program the FPGA to run various instructions. + +To begin with, we need to import tvm which is our compiler stack for VTA. +We also need to import vta python package which contains VTA specific +extensions for compiler to generate code that runs on VTA. +""" +from __future__ import absolute_import, print_function + +import tvm +import vta + +###################################################################### +# Program the FPGA with VTA Bistream +# ---------------------------------- +# In the first step, we need to program the FPGA with VTA bitstream. +# + +###################################################################### +# Run Simple Copy Instruction +# --------------------------- +# + +###################################################################### +# Run Matrix Instruction +# ---------------------- +# + +###################################################################### +# Matrix Multiplication Example +# ----------------------------- +#