← Back to C-Kernel-Engine Docs Doxygen Source Documentation
 
Loading...
Searching...
No Matches
ckernel_ir_v2.h File Reference
#include "ckernel_ir.h"
#include "ckernel_kernel_specs.h"
#include <stdint.h>

Go to the source code of this file.

Data Structures

struct  CKIRV2Binding
 
struct  CKIRV2Buffer
 
struct  CKIRV2Graph
 
struct  CKIRV2Node
 

Macros

#define CK_IR_V2_MAX_BINDINGS   24
 
#define CK_IR_V2_MAX_DIMS   4
 
#define CK_IR_V2_MAX_INPUTS   8
 
#define CK_IR_V2_MAX_OUTPUTS   4
 

Enumerations

enum  CKIRV2NodeFlags { CK_IR_V2_NODE_NONE = 0 , CK_IR_V2_NODE_FUSED = 1 << 0 , CK_IR_V2_NODE_INFERENCE_ONLY = 1 << 1 }
 

Functions

int ck_ir_v2_apply_meta (const char *path, CKIRV2Graph *graph)
 
int ck_ir_v2_build_decoder (const CKModelConfig *cfg, CKIRV2Graph *graph)
 
int ck_ir_v2_build_decoder_backward (const CKIRV2Graph *forward, CKIRV2Graph *backward)
 
void ck_ir_v2_free (CKIRV2Graph *graph)
 
int ck_ir_v2_parse_json (const char *path, CKIRV2Graph *graph)
 
int ck_ir_v2_serialize_json (const CKIRV2Graph *graph, const char *path)
 
int ck_ir_v2_serialize_json_with_plan (const CKIRV2Graph *graph, const struct CKMemPlan *plan, const char *mode, int tokens_override, int base_context_window, const char *path)
 

Macro Definition Documentation

◆ CK_IR_V2_MAX_BINDINGS

#define CK_IR_V2_MAX_BINDINGS   24

Definition at line 16 of file ckernel_ir_v2.h.

◆ CK_IR_V2_MAX_DIMS

#define CK_IR_V2_MAX_DIMS   4

Definition at line 13 of file ckernel_ir_v2.h.

◆ CK_IR_V2_MAX_INPUTS

#define CK_IR_V2_MAX_INPUTS   8

Definition at line 14 of file ckernel_ir_v2.h.

◆ CK_IR_V2_MAX_OUTPUTS

#define CK_IR_V2_MAX_OUTPUTS   4

Definition at line 15 of file ckernel_ir_v2.h.

Enumeration Type Documentation

◆ CKIRV2NodeFlags

Enumerator
CK_IR_V2_NODE_NONE 
CK_IR_V2_NODE_FUSED 
CK_IR_V2_NODE_INFERENCE_ONLY 

Definition at line 18 of file ckernel_ir_v2.h.

18 {
20 CK_IR_V2_NODE_FUSED = 1 << 0,
CKIRV2NodeFlags
@ CK_IR_V2_NODE_FUSED
@ CK_IR_V2_NODE_INFERENCE_ONLY
@ CK_IR_V2_NODE_NONE

Function Documentation

◆ ck_ir_v2_apply_meta()

int ck_ir_v2_apply_meta ( const char *  path,
CKIRV2Graph graph 
)

Definition at line 220 of file ckernel_ir_v2_builder.c.

221{
222 if (!path || !graph) {
223 return -1;
224 }
225 FILE *f = fopen(path, "rb");
226 if (!f) {
227 perror("ck_ir_v2_apply_meta: fopen");
228 return -1;
229 }
230 if (fseek(f, 0, SEEK_END) != 0) {
231 fclose(f);
232 return -1;
233 }
234 long len = ftell(f);
235 if (len < 0) {
236 fclose(f);
237 return -1;
238 }
239 if (fseek(f, 0, SEEK_SET) != 0) {
240 fclose(f);
241 return -1;
242 }
243 char *buf = (char *)malloc((size_t)len + 1);
244 if (!buf) {
245 fclose(f);
246 return -1;
247 }
248 size_t nread = fread(buf, 1, (size_t)len, f);
249 fclose(f);
250 buf[nread] = '\0';
251 const char *end = buf + nread;
252
253 int val = 0;
254 if (ck_ir_v2_parse_bool(buf, "\"has_pos_emb\"", end, &val) == 0) {
255 graph->has_pos_emb = val ? 1 : 0;
256 }
257 if (ck_ir_v2_parse_bool(buf, "\"tie_word_embeddings\"", end, &val) == 0) {
258 graph->tie_word_embeddings = val ? 1 : 0;
259 if (graph->tie_word_embeddings == 0) {
260 int idx = ck_ir_v2_find_buffer_index(graph, "lm_head_weight");
261 if (idx >= 0) {
262 free(graph->buffers[idx].alias_of);
263 graph->buffers[idx].alias_of = NULL;
264 }
265 } else {
266 int idx = ck_ir_v2_find_buffer_index(graph, "lm_head_weight");
267 if (idx >= 0) {
268 free(graph->buffers[idx].alias_of);
269 graph->buffers[idx].alias_of = ck_ir_v2_strdup("token_emb");
270 }
271 }
272 }
273 if (ck_ir_v2_parse_bool(buf, "\"fused_qkv\"", end, &val) == 0) {
274 graph->fused_qkv = val ? 1 : 0;
275 }
276 if (ck_ir_v2_parse_bool(buf, "\"gated_mlp\"", end, &val) == 0) {
277 graph->gated_mlp = val ? 1 : 0;
278 }
279 (void)ck_ir_v2_apply_weight_dtypes(buf, end, graph);
280
281 free(buf);
282 return 0;
283}
static int ck_ir_v2_apply_weight_dtypes(const char *json, const char *end, CKIRV2Graph *graph)
static int ck_ir_v2_parse_bool(const char *json, const char *key, const char *end, int *out)
static int ck_ir_v2_find_buffer_index(const CKIRV2Graph *graph, const char *name)
static char * ck_ir_v2_strdup(const char *s)
int tie_word_embeddings
CKIRV2Buffer * buffers
uint32_t end
Definition utf8.c:215

References CKIRV2Buffer::alias_of, CKIRV2Graph::buffers, ck_ir_v2_apply_weight_dtypes(), ck_ir_v2_find_buffer_index(), ck_ir_v2_parse_bool(), ck_ir_v2_strdup(), end, CKIRV2Graph::fused_qkv, CKIRV2Graph::gated_mlp, CKIRV2Graph::has_pos_emb, and CKIRV2Graph::tie_word_embeddings.

Referenced by main().

◆ ck_ir_v2_build_decoder()

int ck_ir_v2_build_decoder ( const CKModelConfig cfg,
CKIRV2Graph graph 
)

Definition at line 285 of file ckernel_ir_v2_builder.c.

286{
287 if (!cfg || !graph) {
288 return -1;
289 }
290 memset(graph, 0, sizeof(*graph));
291 graph->config = *cfg;
292 graph->has_pos_emb = 1;
293 graph->tie_word_embeddings = -1;
294 graph->fused_qkv = -1;
295 graph->gated_mlp = -1;
296
298 graph->buffers = (CKIRV2Buffer *)calloc((size_t)graph->num_buffers, sizeof(CKIRV2Buffer));
299 if (!graph->buffers) {
300 return -1;
301 }
302 for (int i = 0; i < graph->num_buffers; ++i) {
303 if (ck_ir_v2_copy_buffer_spec(&ck_decoder_buffers[i], &graph->buffers[i]) != 0) {
304 ck_ir_v2_free(graph);
305 return -1;
306 }
307 if (graph->buffers[i].name && strcmp(graph->buffers[i].name, "pos_emb") == 0) {
308 free(graph->buffers[i].condition);
309 graph->buffers[i].condition = ck_ir_v2_strdup("has_pos_emb");
310 }
311 }
312
313 int plan_count = (int)ck_decoder_forward_plan_v2_count;
314 graph->num_nodes = cfg->num_layers * plan_count;
315 graph->nodes = (CKIRV2Node *)calloc((size_t)graph->num_nodes, sizeof(CKIRV2Node));
316 if (!graph->nodes) {
317 ck_ir_v2_free(graph);
318 return -1;
319 }
320
321 int idx = 0;
322 for (int layer = 0; layer < cfg->num_layers; ++layer) {
323 for (int p = 0; p < plan_count; ++p) {
325 const CKKernelSpec *spec = ck_ir_v2_find_kernel_spec(step->kernel);
326 CKDataType dtype = spec ? spec->default_dtype : CK_DT_FP32;
327 const char *impl = ck_ir_v2_select_kernel(spec, dtype, 0);
328 CKIRV2Node *node = &graph->nodes[idx++];
329 node->layer = (uint16_t)layer;
330 node->op = ck_ir_v2_strdup(step->kernel);
331 node->kernel = ck_ir_v2_strdup(impl ? impl : step->kernel);
332 node->kernel_dtype = dtype;
333 node->condition = ck_ir_v2_strdup(step->condition);
334 node->flags = 0;
335 node->n_bindings = 0;
336 if (step->bindings && step->num_bindings > 0) {
337 int limit = (int)step->num_bindings;
338 if (limit > CK_IR_V2_MAX_BINDINGS) {
339 limit = CK_IR_V2_MAX_BINDINGS;
340 }
341 for (int b = 0; b < limit; ++b) {
342 const CKPlanBinding *binding = &step->bindings[b];
343 node->bindings[node->n_bindings].arg = ck_ir_v2_strdup(binding->arg);
344 node->bindings[node->n_bindings].buffer =
345 ck_ir_v2_find_buffer_index(graph, binding->buffer);
346 node->n_bindings++;
347 }
348 }
349 node->n_inputs = 0;
350 node->n_outputs = 0;
351 }
352 }
353 return 0;
354}
CKDataType
Supported data types in C-Kernel-Engine.
@ CK_DT_FP32
#define CK_IR_V2_MAX_BINDINGS
void ck_ir_v2_free(CKIRV2Graph *graph)
static const CKKernelSpec * ck_ir_v2_find_kernel_spec(const char *name)
static int ck_ir_v2_copy_buffer_spec(const CKBufferSpec *spec, CKIRV2Buffer *out)
static const char * ck_ir_v2_select_kernel(const CKKernelSpec *spec, CKDataType dtype, int backward)
const CKPlanStepV2 ck_decoder_forward_plan_v2[]
const size_t ck_decoder_forward_plan_v2_count
const CKBufferSpec ck_decoder_buffers[]
const size_t ck_decoder_buffer_count
CKModelConfig config
CKIRV2Node * nodes
uint8_t n_bindings
char * condition
uint16_t layer
uint8_t flags
CKIRV2Binding bindings[24]
CKDataType kernel_dtype
uint8_t n_outputs
char * kernel
uint8_t n_inputs
CKDataType default_dtype
const char * kernel
const char * condition
const CKPlanBinding * bindings

References CKIRV2Binding::arg, CKPlanBinding::arg, CKIRV2Node::bindings, CKPlanStepV2::bindings, CKIRV2Binding::buffer, CKPlanBinding::buffer, CKIRV2Graph::buffers, ck_decoder_buffer_count, ck_decoder_buffers, ck_decoder_forward_plan_v2, ck_decoder_forward_plan_v2_count, CK_DT_FP32, ck_ir_v2_copy_buffer_spec(), ck_ir_v2_find_buffer_index(), ck_ir_v2_find_kernel_spec(), ck_ir_v2_free(), CK_IR_V2_MAX_BINDINGS, ck_ir_v2_select_kernel(), ck_ir_v2_strdup(), CKIRV2Buffer::condition, CKIRV2Node::condition, CKPlanStepV2::condition, CKIRV2Graph::config, CKKernelSpec::default_dtype, CKIRV2Node::flags, CKIRV2Graph::fused_qkv, CKIRV2Graph::gated_mlp, CKIRV2Graph::has_pos_emb, CKIRV2Node::kernel, CKPlanStepV2::kernel, CKIRV2Node::kernel_dtype, CKIRV2Node::layer, CKIRV2Node::n_bindings, CKIRV2Node::n_inputs, CKIRV2Node::n_outputs, CKIRV2Buffer::name, CKIRV2Graph::nodes, CKPlanStepV2::num_bindings, CKIRV2Graph::num_buffers, CKModelConfig::num_layers, CKIRV2Graph::num_nodes, CKIRV2Node::op, and CKIRV2Graph::tie_word_embeddings.

Referenced by main().

◆ ck_ir_v2_build_decoder_backward()

int ck_ir_v2_build_decoder_backward ( const CKIRV2Graph forward,
CKIRV2Graph backward 
)

Definition at line 356 of file ckernel_ir_v2_builder.c.

357{
358 if (!forward || !backward) {
359 return -1;
360 }
361 memset(backward, 0, sizeof(*backward));
362 backward->config = forward->config;
363
364 backward->num_buffers = forward->num_buffers;
365 backward->buffers = (CKIRV2Buffer *)calloc((size_t)backward->num_buffers, sizeof(CKIRV2Buffer));
366 if (!backward->buffers) {
367 return -1;
368 }
369 for (int i = 0; i < backward->num_buffers; ++i) {
370 CKBufferSpec spec = {0};
371 const CKIRV2Buffer *src = &forward->buffers[i];
372 spec.name = src->name;
373 spec.scope = src->scope;
374 spec.role = src->role;
375 spec.dtype = src->dtype;
376 spec.optional = src->optional;
377 spec.alias_of = src->alias_of;
378 spec.condition = src->condition;
379 memcpy(spec.shape, src->shape, sizeof(spec.shape));
380 if (ck_ir_v2_copy_buffer_spec(&spec, &backward->buffers[i]) != 0) {
381 ck_ir_v2_free(backward);
382 return -1;
383 }
384 }
385
386 int plan_count = (int)ck_decoder_backward_plan_v2_count;
387 backward->num_nodes = forward->config.num_layers * plan_count;
388 backward->nodes = (CKIRV2Node *)calloc((size_t)backward->num_nodes, sizeof(CKIRV2Node));
389 if (!backward->nodes) {
390 ck_ir_v2_free(backward);
391 return -1;
392 }
393
394 int idx = 0;
395 for (int layer = 0; layer < forward->config.num_layers; ++layer) {
396 for (int p = 0; p < plan_count; ++p) {
398 const CKKernelSpec *spec = ck_ir_v2_find_kernel_spec(step->kernel);
399 CKDataType dtype = spec ? spec->default_dtype : CK_DT_FP32;
400 const char *impl = ck_ir_v2_select_kernel(spec, dtype, 1);
401 CKIRV2Node *node = &backward->nodes[idx++];
402 node->layer = (uint16_t)layer;
403 node->op = ck_ir_v2_strdup(step->kernel);
404 node->kernel = ck_ir_v2_strdup(impl ? impl : step->kernel);
405 node->kernel_dtype = dtype;
406 node->condition = ck_ir_v2_strdup(step->condition);
407 node->flags = 0;
408 node->n_bindings = 0;
409 if (step->bindings && step->num_bindings > 0) {
410 int limit = (int)step->num_bindings;
411 if (limit > CK_IR_V2_MAX_BINDINGS) {
412 limit = CK_IR_V2_MAX_BINDINGS;
413 }
414 for (int b = 0; b < limit; ++b) {
415 const CKPlanBinding *binding = &step->bindings[b];
416 node->bindings[node->n_bindings].arg = ck_ir_v2_strdup(binding->arg);
417 node->bindings[node->n_bindings].buffer =
418 ck_ir_v2_find_buffer_index(backward, binding->buffer);
419 node->n_bindings++;
420 }
421 }
422 node->n_inputs = 0;
423 node->n_outputs = 0;
424 }
425 }
426 return 0;
427}
const size_t ck_decoder_backward_plan_v2_count
const CKPlanStepV2 ck_decoder_backward_plan_v2[]
const char * alias_of
const char * condition
CKBufferScope scope
CKDimToken shape[4]
CKDimToken shape[4]
CKBufferRole role
CKBufferScope scope
CKDataType dtype

References CKIRV2Buffer::alias_of, CKBufferSpec::alias_of, CKIRV2Binding::arg, CKPlanBinding::arg, CKIRV2Node::bindings, CKPlanStepV2::bindings, CKIRV2Binding::buffer, CKPlanBinding::buffer, CKIRV2Graph::buffers, ck_decoder_backward_plan_v2, ck_decoder_backward_plan_v2_count, CK_DT_FP32, ck_ir_v2_copy_buffer_spec(), ck_ir_v2_find_buffer_index(), ck_ir_v2_find_kernel_spec(), ck_ir_v2_free(), CK_IR_V2_MAX_BINDINGS, ck_ir_v2_select_kernel(), ck_ir_v2_strdup(), CKIRV2Buffer::condition, CKIRV2Node::condition, CKBufferSpec::condition, CKPlanStepV2::condition, CKIRV2Graph::config, CKKernelSpec::default_dtype, CKIRV2Buffer::dtype, CKBufferSpec::dtype, CKIRV2Node::flags, CKIRV2Node::kernel, CKPlanStepV2::kernel, CKIRV2Node::kernel_dtype, CKIRV2Node::layer, CKIRV2Node::n_bindings, CKIRV2Node::n_inputs, CKIRV2Node::n_outputs, CKIRV2Buffer::name, CKBufferSpec::name, CKIRV2Graph::nodes, CKPlanStepV2::num_bindings, CKIRV2Graph::num_buffers, CKModelConfig::num_layers, CKIRV2Graph::num_nodes, CKIRV2Node::op, CKIRV2Buffer::optional, CKBufferSpec::optional, CKIRV2Buffer::role, CKBufferSpec::role, CKIRV2Buffer::scope, CKBufferSpec::scope, CKIRV2Buffer::shape, and CKBufferSpec::shape.

Referenced by main().

◆ ck_ir_v2_free()

void ck_ir_v2_free ( CKIRV2Graph graph)

Definition at line 34 of file ckernel_ir_v2.c.

35{
36 if (!graph) {
37 return;
38 }
39 if (graph->buffers) {
40 for (int i = 0; i < graph->num_buffers; ++i) {
41 ck_ir_v2_free_buffer(&graph->buffers[i]);
42 }
43 free(graph->buffers);
44 }
45 if (graph->nodes) {
46 for (int i = 0; i < graph->num_nodes; ++i) {
47 ck_ir_v2_free_node(&graph->nodes[i]);
48 }
49 free(graph->nodes);
50 }
51 memset(graph, 0, sizeof(*graph));
52}
static void ck_ir_v2_free_node(CKIRV2Node *node)
static void ck_ir_v2_free_buffer(CKIRV2Buffer *buf)

References CKIRV2Graph::buffers, ck_ir_v2_free_buffer(), ck_ir_v2_free_node(), CKIRV2Graph::nodes, CKIRV2Graph::num_buffers, and CKIRV2Graph::num_nodes.

Referenced by ck_ir_v2_build_decoder(), ck_ir_v2_build_decoder_backward(), ck_ir_v2_lower_emit_json(), ck_ir_v2_lower_graph(), ck_ir_v2_parse_json(), and main().

◆ ck_ir_v2_parse_json()

int ck_ir_v2_parse_json ( const char *  path,
CKIRV2Graph graph 
)

Definition at line 1100 of file ckernel_ir_v2.c.

1101{
1102 if (!path || !graph) {
1103 return -1;
1104 }
1105 FILE *f = fopen(path, "rb");
1106 if (!f) {
1107 perror("ck_ir_v2_parse_json: fopen");
1108 return -1;
1109 }
1110 if (fseek(f, 0, SEEK_END) != 0) {
1111 fclose(f);
1112 return -1;
1113 }
1114 long len = ftell(f);
1115 if (len < 0) {
1116 fclose(f);
1117 return -1;
1118 }
1119 if (fseek(f, 0, SEEK_SET) != 0) {
1120 fclose(f);
1121 return -1;
1122 }
1123 char *buf = (char *)malloc((size_t)len + 1);
1124 if (!buf) {
1125 fclose(f);
1126 return -1;
1127 }
1128 size_t nread = fread(buf, 1, (size_t)len, f);
1129 fclose(f);
1130 buf[nread] = '\0';
1131
1132 CKIRV2Graph tmp = {0};
1133 const char *end = buf + nread;
1134
1135 tmp.has_pos_emb = 1;
1136 tmp.tie_word_embeddings = -1;
1137 tmp.fused_qkv = -1;
1138 tmp.gated_mlp = -1;
1139
1140 if (ck_ir_v2_parse_int(buf, "\"num_layers\"", end, &tmp.config.num_layers) != 0 ||
1141 ck_ir_v2_parse_int(buf, "\"hidden_size\"", end, &tmp.config.hidden_size) != 0 ||
1142 ck_ir_v2_parse_int(buf, "\"intermediate_size\"", end, &tmp.config.intermediate_size) != 0 ||
1143 ck_ir_v2_parse_int(buf, "\"num_attention_heads\"", end, &tmp.config.num_heads) != 0 ||
1144 ck_ir_v2_parse_int(buf, "\"num_kv_heads\"", end, &tmp.config.num_kv_heads) != 0) {
1145 free(buf);
1146 return -1;
1147 }
1148
1149 ck_ir_v2_parse_int(buf, "\"vocab_size\"", end, &tmp.config.vocab_size);
1150 ck_ir_v2_parse_int(buf, "\"context_window\"", end, &tmp.config.context_window);
1151 ck_ir_v2_parse_float(buf, "\"rms_norm_eps\"", end, &tmp.config.rms_norm_eps);
1152 ck_ir_v2_parse_float(buf, "\"rope_theta\"", end, &tmp.config.rope_theta);
1153 const char *meta_key = ck_ir_v2_find_key(buf, "\"meta\"", end);
1154 if (meta_key) {
1155 const char *brace = strchr(meta_key, '{');
1156 const char *obj_start = NULL;
1157 const char *obj_end = NULL;
1158 if (brace && ck_ir_v2_next_object(brace, end, &obj_start, &obj_end)) {
1159 ck_ir_v2_parse_bool(obj_start, "\"has_pos_emb\"", obj_end, &tmp.has_pos_emb);
1160 ck_ir_v2_parse_bool(obj_start, "\"tie_word_embeddings\"", obj_end, &tmp.tie_word_embeddings);
1161 ck_ir_v2_parse_bool(obj_start, "\"fused_qkv\"", obj_end, &tmp.fused_qkv);
1162 ck_ir_v2_parse_bool(obj_start, "\"gated_mlp\"", obj_end, &tmp.gated_mlp);
1163 }
1164 }
1165
1166 if (ck_ir_v2_parse_buffers(buf, end, &tmp) != 0 ||
1167 ck_ir_v2_parse_nodes(buf, end, &tmp) != 0) {
1168 ck_ir_v2_free(&tmp);
1169 free(buf);
1170 return -1;
1171 }
1172
1173 *graph = tmp;
1174 free(buf);
1175 return 0;
1176}
static const char * ck_ir_v2_find_key(const char *json, const char *key, const char *end)
static int ck_ir_v2_parse_buffers(const char *json, const char *end, CKIRV2Graph *graph)
static const char * ck_ir_v2_next_object(const char *cur, const char *end, const char **obj_start, const char **obj_end)
void ck_ir_v2_free(CKIRV2Graph *graph)
static int ck_ir_v2_parse_bool(const char *json, const char *key, const char *end, int *out_val)
static int ck_ir_v2_parse_int(const char *json, const char *key, const char *end, int *out_val)
static int ck_ir_v2_parse_nodes(const char *json, const char *end, CKIRV2Graph *graph)
static int ck_ir_v2_parse_float(const char *json, const char *key, const char *end, float *out_val)
float rms_norm_eps
Definition ckernel_ir.h:31
float rope_theta
Definition ckernel_ir.h:32

References ck_ir_v2_find_key(), ck_ir_v2_free(), ck_ir_v2_next_object(), ck_ir_v2_parse_bool(), ck_ir_v2_parse_buffers(), ck_ir_v2_parse_float(), ck_ir_v2_parse_int(), ck_ir_v2_parse_nodes(), CKIRV2Graph::config, CKModelConfig::context_window, end, CKIRV2Graph::fused_qkv, CKIRV2Graph::gated_mlp, CKIRV2Graph::has_pos_emb, CKModelConfig::hidden_size, CKModelConfig::intermediate_size, CKModelConfig::num_heads, CKModelConfig::num_kv_heads, CKModelConfig::num_layers, CKModelConfig::rms_norm_eps, CKModelConfig::rope_theta, CKIRV2Graph::tie_word_embeddings, and CKModelConfig::vocab_size.

Referenced by main().

◆ ck_ir_v2_serialize_json()

int ck_ir_v2_serialize_json ( const CKIRV2Graph graph,
const char *  path 
)

Definition at line 511 of file ckernel_ir_v2.c.

512{
513 return ck_ir_v2_serialize_json_internal(graph, NULL, NULL, -1, -1, path);
514}
static int ck_ir_v2_serialize_json_internal(const CKIRV2Graph *graph, const CKMemPlan *plan, const char *mode, int tokens_override, int base_context_window, const char *path)

References ck_ir_v2_serialize_json_internal().

Referenced by main().

◆ ck_ir_v2_serialize_json_with_plan()

int ck_ir_v2_serialize_json_with_plan ( const CKIRV2Graph graph,
const struct CKMemPlan plan,
const char *  mode,
int  tokens_override,
int  base_context_window,
const char *  path 
)