# LLVM TableGen Kernel
This notebook is running `llvm-tblgen`.
```tablegen
%reset
// This is some tablegen
class Foo {}
```
------------- Classes -----------------
class Foo {
}
------------- Defs -----------------
Errors printed to stderr are shown.
```tablegen
%reset
This is not tablegen.
```
<stdin>:1:1: error: Unexpected token at top level
This is not tablegen.
^
Add some classes to get some output.
```tablegen
%reset
class Stuff {}
def thing : Stuff {}
```
------------- Classes -----------------
class Stuff {
}
------------- Defs -----------------
def thing { // Stuff
}
By default cells are connected. Meaning that we cache the code and magic directives from the previously run cells.
This means that the next cell still sees the `Stuff` class.
```tablegen
def other_thing : Stuff {}
```
------------- Classes -----------------
class Stuff {
}
------------- Defs -----------------
def other_thing { // Stuff
}
def thing { // Stuff
}
You can use the magic `%reset` to clear this cache and start fresh.
```tablegen
%reset
def other_thing : Stuff {}
```
<stdin>:1:19: error: Couldn't find class 'Stuff'
def other_thing : Stuff {}
^
You can also configure the default reset behaviour using the `%config` magic.
```tablegen
%config cellreset on
class Thing {}
```
------------- Classes -----------------
class Thing {
}
------------- Defs -----------------
```tablegen
// The cache is reset here so this is an error.
def AThing: Thing {}
```
<stdin>:2:13: error: Couldn't find class 'Thing'
def AThing: Thing {}
^
The default value is `off`, meaning cells are connected. If you want to override the default for one cell only, use the `%reset` or `%noreset` magic. These always override the default.
```tablegen
class Thing {}
```
------------- Classes -----------------
class Thing {
}
------------- Defs -----------------
```tablegen
%noreset
// This works because of the noreset above.
def AThing: Thing {}
```
------------- Classes -----------------
class Thing {
}
------------- Defs -----------------
def AThing { // Thing
}
```tablegen
// This does not because we're not changing the default.
def AnotherThing: Thing {}
```
<stdin>:2:19: error: Couldn't find class 'Thing'
def AnotherThing: Thing {}
^
```tablegen
%config cellreset off
%reset
// Here we have an empty cache and default reset behaviour.
```
------------- Classes -----------------
------------- Defs -----------------
It is not valid to have `%reset` and `%noreset` in the same cell.
```tablegen
%reset
%noreset
```
%reset and %noreset in the same cell is not allowed. Use only one, or neither.
Consider setting `cellreset` to the majority usecase for your notebook. For example a tutorial building a large example across many cells will likely want it `off`. One with many standalone examples, `on`.
There is a "magic" directive `%args` that you can use to send command line arguments to `llvm-tblgen`.
For example, here we have some code that shows a warning.
```tablegen
%reset
class Thing <int A, int B> {
int num = A;
}
```
<stdin>:1:25: warning: unused template argument: Thing:B
class Thing <int A, int B> {
^
We can pass an argument to ignore that warning.
```tablegen
%args --no-warn-on-unused-template-args
```
------------- Classes -----------------
class Thing<int Thing:A = ?, int Thing:B = ?> {
int num = Thing:A;
}
------------- Defs -----------------
If you have a run of cells without a `%reset`, the most recent `%args` is used.
```tablegen
// This passes --no-warn-on-unused-template-args
```
------------- Classes -----------------
class Thing<int Thing:A = ?, int Thing:B = ?> {
int num = Thing:A;
}
------------- Defs -----------------
```tablegen
%args
// Now we're not passing the argument so the warning comes back.
```
<stdin>:1:25: warning: unused template argument: Thing:B
class Thing <int A, int B> {
^
If there are many `%args` in a cell, the last one is used.
```tablegen
%reset
%args --no-warn-on-unused-template-args
%args
class Thing <int A, int B> {}
```
<stdin>:1:18: warning: unused template argument: Thing:A
class Thing <int A, int B> {}
^
<stdin>:1:25: warning: unused template argument: Thing:B
class Thing <int A, int B> {}
^