19#ifndef TVM_SCRIPT_PRINTER_IR_DOCSIFIER_H_
20#define TVM_SCRIPT_PRINTER_IR_DOCSIFIER_H_
22#include <tvm/ffi/device.h>
23#include <tvm/ffi/reflection/access_path.h>
24#include <tvm/ffi/reflection/registry.h>
31#include <unordered_map>
32#include <unordered_set>
61 namespace refl = tvm::ffi::reflection;
75 template <
typename TCallback>
77 callbacks.emplace_back(std::forward<TCallback>(
cb));
99class Frame :
public ffi::ObjectRef {
132 ffi::Optional<ffi::String>
name;
149 std::unordered_map<ffi::ObjectRef, VariableInfo, ffi::ObjectPtrHash, ffi::ObjectPtrEqual>
152 std::unordered_map<ffi::String, ffi::Array<ffi::Any>>
metadata;
158 std::unordered_map<const ffi::Object*, std::vector<const ffi::Object*>>
common_prefix;
163 namespace refl = tvm::ffi::reflection;
164 refl::ObjectDef<IRDocsifierNode>()
240 template <
class TDoc = Doc>
262 d->
frames.push_back(ffi::GetRef<Frame>(
this));
267 for (
const std::function<
void()>& callback :
callbacks) {
277inline static void AddDocDecoration(
const Doc& d,
const ffi::ObjectRef&
obj,
const AccessPath& path,
279 if (cfg->obj_to_annotate.count(
obj)) {
281 if (stmt->comment.has_value()) {
282 stmt->comment = stmt->comment.value() +
"\n" + cfg->obj_to_annotate.at(
obj);
284 stmt->comment = cfg->obj_to_annotate.at(
obj);
287 LOG(WARNING) <<
"Expect StmtDoc to be annotated for object " << obj <<
", but got "
288 << d.as_or_throw<TDoc>()->_type_key;
291 for (
const ffi::ObjectRef& o : cfg->obj_to_underline) {
292 if (o.same_as(obj)) {
293 cfg->path_to_underline.push_back(path);
296 for (
const auto& pair : cfg->path_to_annotate) {
298 ffi::String attn = pair.second;
299 if (p->IsPrefixOf(path) && path->IsPrefixOf(p)) {
300 if (
const auto* stmt = d.as<StmtDocNode>()) {
301 if (stmt->comment.has_value()) {
302 stmt->comment = stmt->comment.value() +
"\n" + attn;
304 stmt->comment = attn;
307 LOG(WARNING) <<
"Expect StmtDoc to be annotated at object path " << p <<
", but got "
308 << d.as_or_throw<TDoc>()->_type_key;
316 switch (value.type_index()) {
317 case ffi::TypeIndex::kTVMFFINone:
319 case ffi::TypeIndex::kTVMFFIBool:
321 case ffi::TypeIndex::kTVMFFIInt:
323 case ffi::TypeIndex::kTVMFFIFloat:
325 case ffi::TypeIndex::kTVMFFISmallStr:
326 case ffi::TypeIndex::kTVMFFIStr: {
332 return d.as_or_throw<
TDoc>();
336 case ffi::TypeIndex::kTVMFFIDataType:
338 case ffi::TypeIndex::kTVMFFIDevice:
341 if (
auto opt_obj = value.as<ffi::ObjectRef>()) {
344 ffi::GetRef<IRDocsifier>(
this));
345 d->source_paths.push_back(path);
347 return d.as_or_throw<
TDoc>();
Managed reference to GlobalInfoNode.
Definition global_info.h:54
RAII wrapper function to enter and exit a context object similar to python's with syntax.
Definition with_context.h:59
Reference type of DocNode.
Definition doc.h:88
Reference type of ExprDocNode.
Definition doc.h:146
Definition ir_docsifier.h:51
virtual void EnterWithScope()
Method that's called when Frame enters the scope.
Definition ir_docsifier.h:260
static void RegisterReflection()
Definition ir_docsifier.h:60
IRDocsifierNode * d
Definition ir_docsifier.h:56
virtual void ExitWithScope()
Method that's called when Frame exits the scope.
Definition ir_docsifier.h:266
void AddExitCallback(TCallback &&cb)
Add a callback function to be called when this frame exits.
Definition ir_docsifier.h:76
TVM_FFI_DECLARE_OBJECT_INFO("script.printer.Frame", FrameNode, ffi::Object)
std::vector< std::function< void()> > callbacks
Definition ir_docsifier.h:58
ffi::Array< StmtDoc > stmts
Definition ir_docsifier.h:54
void AddDispatchToken(const IRDocsifier &d, const ffi::String &token)
Add a dispatch token to the docsifier, and a callback that pops the token when this frame exits.
Definition ir_docsifier.h:356
static constexpr const bool _type_mutable
Definition ir_docsifier.h:65
virtual ~FrameNode()=default
Reference type of FrameNode.
Definition ir_docsifier.h:99
void EnterWithScope()
Method that's called when Frame enters the scope.
Definition ir_docsifier.h:107
void ExitWithScope()
Method that's called when Frame exits the scope.
Definition ir_docsifier.h:110
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(Frame, ffi::ObjectRef, FrameNode)
IRDocsifier is the top-level interface in the IR->Doc process.
Definition ir_docsifier.h:123
std::unordered_set< std::string > ir_usage
The IR usages for headers printing.
Definition ir_docsifier.h:160
std::function< ExprDoc()> DocCreator
A function that creates the doc for a variable.
Definition ir_docsifier.h:126
IdDoc Define(const ffi::ObjectRef &obj, const Frame &frame, const ffi::String &name_hint)
Define variable by name.
bool IsVarDefined(const ffi::ObjectRef &obj) const
Check if a variable exists in the table.
ExprDoc AddMetadata(const ffi::Any &obj)
Add a TVM object to the metadata section.
std::unordered_map< ffi::ObjectRef, VariableInfo, ffi::ObjectPtrHash, ffi::ObjectPtrEqual > obj2info
Mapping from a var to its info.
Definition ir_docsifier.h:150
std::unordered_map< ffi::String, ffi::Array< ffi::Any > > metadata
Metadata printing.
Definition ir_docsifier.h:152
TDoc AsDoc(const Any &obj, const AccessPath &path) const
Transform the input object into TDoc.
Definition ir_docsifier.h:315
ffi::Array< Frame > frames
The stack of frames.
Definition ir_docsifier.h:140
ffi::Array< ffi::String > dispatch_tokens
The stack of dispatch tokens.
Definition ir_docsifier.h:147
std::unordered_set< ffi::String > defined_names
The variable names used already.
Definition ir_docsifier.h:156
PrinterConfig cfg
The configuration of the printer.
Definition ir_docsifier.h:135
TVM_FFI_DECLARE_OBJECT_INFO_FINAL("script.printer.IRDocsifier", IRDocsifierNode, ffi::Object)
static void RegisterReflection()
Definition ir_docsifier.h:162
std::unordered_map< ffi::String, ffi::Array< GlobalInfo > > global_infos
GlobalInfo printing.
Definition ir_docsifier.h:154
std::unordered_map< const ffi::Object *, std::vector< const ffi::Object * > > common_prefix
Common prefixes of variable usages.
Definition ir_docsifier.h:158
void SetCommonPrefix(const ffi::ObjectRef &root, ffi::TypedFunction< bool(ffi::ObjectRef)> is_var)
Set the common prefix information of variable usage.
static constexpr const bool _type_mutable
Definition ir_docsifier.h:169
void Define(const ffi::ObjectRef &obj, const Frame &frame, DocCreator doc_factory)
Define variable by doc factory.
void AddGlobalInfo(const ffi::String &name, const GlobalInfo &ginfo)
Add a GlobalInfo to the global_infos map.
ffi::Optional< ExprDoc > GetVarDoc(const ffi::ObjectRef &obj) const
Get the doc for variable.
void RemoveVar(const ffi::ObjectRef &obj)
Remove the variable defined.
Reference type of IRDocsifierNode.
Definition ir_docsifier.h:247
static FType & vtable()
The registration table for IRDocsifier.
IRDocsifier(const PrinterConfig &cfg)
Create a IRDocsifier.
TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE(IRDocsifier, ffi::ObjectRef, IRDocsifierNode)
Reference type of IdDocNode.
Definition doc.h:387
static LiteralDoc DataType(DLDataType v, const ffi::Optional< AccessPath > &p)
Create a LiteralDoc to represent string.
Definition doc.h:312
static LiteralDoc Boolean(bool v, const ffi::Optional< AccessPath > &p)
Create a LiteralDoc to represent boolean.
Definition doc.h:288
static LiteralDoc Device(const DLDevice &v, const ffi::Optional< AccessPath > &p)
Create a LiteralDoc to represent device.
Definition doc.h:322
static LiteralDoc Int(int64_t v, const ffi::Optional< AccessPath > &p)
Create a LiteralDoc to represent integer.
Definition doc.h:280
static LiteralDoc Float(double v, const ffi::Optional< AccessPath > &p)
Create a LiteralDoc to represent float.
Definition doc.h:296
static LiteralDoc None(const ffi::Optional< AccessPath > &p)
Create a LiteralDoc to represent None/null/empty value.
Definition doc.h:272
static LiteralDoc Str(const ffi::String &v, const ffi::Optional< AccessPath > &p)
Create a LiteralDoc to represent string.
Definition doc.h:304
The base class of statement doc.
Definition doc.h:169
Configuration object for the TVMScript printer.
IRModule that holds the functions and type definitions.
ffi::reflection::AccessPath AccessPath
Definition doc.h:36
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition analyzer.h:40
Information about a variable, including its optional name and its doc creator.
Definition ir_docsifier.h:128
DocCreator creator
The creator.
Definition ir_docsifier.h:130
ffi::Optional< ffi::String > name
The name of the variable.
Definition ir_docsifier.h:132