import { z } from 'zod';
import { IpVendor } from '../types/index.js';
import { zodToJsonSchema } from 'zod-to-json-schema';
const FindIpVendorsSchema = z.object({
category: z.string().describe('IP category (e.g., PHY, Controller, Interface)'),
subcategory: z.string().optional().describe('Subcategory (e.g., DDR5, PCIe, USB)'),
keywords: z.array(z.string()).optional().describe('Additional search keywords'),
processNode: z.string().optional().describe('Process node (e.g., 28nm, 7nm, 5nm)'),
powerRequirement: z.string().optional().describe('Power requirement (e.g., low-power, ultra-low-power)'),
foundry: z.string().optional().describe('Foundry (e.g., TSMC, Samsung, Intel)'),
limit: z.number().optional().default(10).describe('Maximum number of results'),
});
type FindIpVendorsArgs = z.infer<typeof FindIpVendorsSchema>;
export const findIpVendorsTool = {
definition: {
name: 'find_ip_vendors',
description: 'Find IP core vendors based on category, technology, and requirements',
inputSchema: zodToJsonSchema(FindIpVendorsSchema) as any,
},
handler: async (args: unknown) => {
const parsed = FindIpVendorsSchema.parse(args);
// TODO: Implement actual web scraping logic
// For now, return mock data
const mockVendors: IpVendor[] = [
{
name: 'DDR5 PHY IP',
company: 'Synopsys',
category: parsed.category,
subcategory: parsed.subcategory || 'DDR5',
description: 'High-performance DDR5 PHY supporting up to 6400 MT/s',
processNodes: ['7nm', '5nm', '3nm'],
features: ['Low power', 'DFI 5.0 compliant', 'Built-in training'],
website: 'https://www.synopsys.com',
},
{
name: 'DDR5 Memory Controller',
company: 'Cadence',
category: parsed.category,
subcategory: parsed.subcategory || 'DDR5',
description: 'Configurable DDR5 controller with advanced RAS features',
processNodes: ['12nm', '7nm', '5nm'],
features: ['ECC support', 'Power management', 'QoS'],
website: 'https://www.cadence.com',
},
];
// Filter based on process node if specified
let results = mockVendors;
if (parsed.processNode) {
results = results.filter(vendor =>
vendor.processNodes?.includes(parsed.processNode!)
);
}
// Apply limit
results = results.slice(0, parsed.limit);
return {
content: [
{
type: 'text',
text: `Found ${results.length} IP vendors matching your criteria:\n\n` +
results.map((vendor, i) =>
`${i + 1}. ${vendor.company} - ${vendor.name}\n` +
` Category: ${vendor.category}/${vendor.subcategory}\n` +
` Process Nodes: ${vendor.processNodes?.join(', ')}\n` +
` Features: ${vendor.features?.join(', ')}\n`
).join('\n'),
},
],
data: results,
};
},
};